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"