Home | 簡體中文 | 繁體中文 | 雜文 | 打賞(Donations) | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 知乎專欄 | 視頻教程 | About

3.13. set 無序字符集合

Set和List類型不同的是,Set集合中不允許出現重複的元素,和List類型相比,Set類型在功能上還存在着一個非常重要的特性,即在伺服器端完成多個Sets之間的聚合計算操作,如unions、intersections和differences。由於這些操作均在服務端完成,因此效率極高,而且也節省了大量的網絡IO開銷。

1. SADD/SMEMBERS/SCARD/SISMEMBER:

			
    #插入測試數據,由於該鍵set:test之前並不存在,因此參數中的三個成員都被正常插入。
    redis 127.0.0.1:6379> sadd set:test a b c
    (integer) 3
    #由於參數中的a在set:test中已經存在,因此本次操作僅僅插入了d和e兩個新成員。
    redis 127.0.0.1:6379> sadd set:test a d e
    (integer) 2
    #判斷a是否已經存在,返回值為1表示存在。
    redis 127.0.0.1:6379> sismember set:test a
    (integer) 1
    #判斷f是否已經存在,返回值為0表示不存在。
    redis 127.0.0.1:6379> sismember set:test f
    (integer) 0
    #通過smembers命令查看插入的結果,從結果可以,輸出的順序和插入順序無關。
    redis 127.0.0.1:6379> smembers set:test
    1) "c"
    2) "d"
    3) "a"
    4) "b"
    5) "e"
    #獲取Set集合中元素的數量。
    redis 127.0.0.1:6379> scard set:test
    (integer) 5
    			
			

2. SPOP/SREM/SRANDMEMBER/SMOVE:

			
    #刪除該鍵,便于後面的測試。
    redis 127.0.0.1:6379> del set:test
    (integer) 1
    #為後面的示例準備測試數據。
    redis 127.0.0.1:6379> sadd set:test a b c d
    (integer) 4
    #查看Set中成員的位置。
    redis 127.0.0.1:6379> smembers set:test
    1) "c"
    2) "d"
    3) "a"
    4) "b"
    #從結果可以看出,該命令確實是隨機的返回了某一成員。
    redis 127.0.0.1:6379> srandmember set:test
    "c"
    #Set中尾部的成員b被移出並返回,事實上b並不是之前插入的第一個或最後一個成員。
    redis 127.0.0.1:6379> spop set:test
    "b"
    #查看移出後Set的成員信息。
    redis 127.0.0.1:6379> smembers set:test
    1) "c"
    2) "d"
    3) "a"
    #從Set中移出a、d和f三個成員,其中f並不存在,因此只有a和d兩個成員被移出,返回為2。
    redis 127.0.0.1:6379> srem set:test a d f
    (integer) 2
    #查看移出後的輸出結果。
    redis 127.0.0.1:6379> smembers set:test
    1) "c"
    #為後面的smove命令準備數據。
    redis 127.0.0.1:6379> sadd set:test a b
    (integer) 2
    redis 127.0.0.1:6379> sadd set:test2 c d
    (integer) 2
    #將a從set:test移到set:test2,從結果可以看出移動成功。
    redis 127.0.0.1:6379> smove set:test set:test2 a
    (integer) 1
    #再次將a從set:test移到set:test2,由於此時a已經不是set:test的成員了,因此移動失敗並返回0。
    redis 127.0.0.1:6379> smove set:test set:test2 a
    (integer) 0
    #分別查看set:test和set:test2的成員,確認移動是否真的成功。
    redis 127.0.0.1:6379> smembers set:test
    1) "b"
    redis 127.0.0.1:6379> smembers set:test2
    1) "c"
    2) "d"
    3) "a"
    			
			

3. SDIFF/SDIFFSTORE/SINTER/SINTERSTORE:

			
    #為後面的命令準備測試數據。
    redis 127.0.0.1:6379> sadd set:test a b c d
    (integer) 4
    redis 127.0.0.1:6379> sadd set:test2 c
    (integer) 1
    redis 127.0.0.1:6379> sadd set:test3 a c e
    (integer) 3
    #set:test和set:test2相比,a、b和d三個成員是兩者之間的差異成員。再用這個結果繼續和set:test3進行差異比較,b和d是set:test3不存在的成員。
    redis 127.0.0.1:6379> sdiff set:test set:test2 set:test3
    1) "d"
    2) "b"
    #將3個集合的差異成員存在在diffkey關聯的Set中,並返回插入的成員數量。
    redis 127.0.0.1:6379> sdiffstore diffkey set:test set:test2 set:test3
    (integer) 2
    #查看一下sdiffstore的操作結果。
    redis 127.0.0.1:6379> smembers diffkey
    1) "d"
    2) "b"
    #從之前準備的數據就可以看出,這三個Set的成員交集只有c。
    redis 127.0.0.1:6379> sinter set:test set:test2 set:test3
    1) "c"
    #將3個集合中的交整合員存儲到與interkey關聯的Set中,並返回交整合員的數量。
    redis 127.0.0.1:6379> sinterstore interkey set:test set:test2 set:test3
    (integer) 1
    #查看一下sinterstore的操作結果。
    redis 127.0.0.1:6379> smembers interkey
    1) "c"
    #獲取3個集合中的成員的並集。    
    redis 127.0.0.1:6379> sunion set:test set:test2 set:test3
    1) "b"
    2) "c"
    3) "d"
    4) "e"
    5) "a"
    #將3個集合中成員的並集存儲到unionkey關聯的set中,並返回並整合員的數量。
    redis 127.0.0.1:6379> sunionstore unionkey set:test set:test2 set:test3
    (integer) 5
    #查看一下suiionstore的操作結果。
    redis 127.0.0.1:6379> smembers unionkey
    1) "b"
    2) "c"
    3) "d"
    4) "e"
    5) "a"