set數據類型介紹
set是集合,它是string類型的無序集合,是隨機的,沒有順序。set是通過hash table實現的,添加、刪除和查找的複雜度都是0(1)。對集合我們可以取並集、交集和差集。通過這些操作,我們可以實現sns中的好友推薦和blog的tag功能。
關於並集、交集和差集,舉個例子:
集合1有數字1,2
集合2有數字2,3
那麼
並集=1,2,3
交集=2
差集=1,3
set數據類型方法
- sadd:向指定的set中添加元素,並且不允許同一個元素重複存在即已經存在的元素會添加不成功,返回值爲0
- smembers:查看指定set的所有元素
- srem:刪除set中指定的元素。rem即remove的縮寫
- spop:隨機返回並刪除set中名稱爲key的一個元素
- sdiff:返回兩個指定集合的差集(即返回所有給定key與第一個key的差集)
- sdiffstore:返回所有給定key與第一個key的差集,並將結果存爲另一個key(也就是說,sdiff只能返回差集,但是不能把結果存下來,sdiffstore就能將返回的差集存下來)
- sinter:返回所有給定key的交集
- sinterstore:返回所有給定key的交集,並將結果存爲另一個key
- sunion:返回所有給定key的並集
- sunionstore:返回所有給定key的並集,並將結果存爲另一個key
- smove:從第一個key對應的set中移除member並添加到第二個對應的set中
- scard:返回指定key的set的元素個數
- sismember:測試member是否是名稱爲key的set的元素
- srandmember:隨機返回名稱爲key的set的一個元素,但是不刪除元素(即隨機取指定set裏面的某個元素,而且不刪除)
方法及操作
1)sadd:向指定的set中添加元素,並且不允許同一個元素重複存在即已經存在的元素會添加不成功,返回值爲0
例如:向myset1中添加一個“crystal”的元素,一個“crystalnew”的元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SADD myset1 crystal #myset1表示set名稱,crystal表示元素
(integer) 1
127.0.0.1:6379> SADD myset1 crystalnew
(integer) 1
127.0.0.1:6379> SADD myset1 crystal #因爲crystal這個元素已經存在,所以這裏返回0,表示添加不成功
(integer) 0
127.0.0.1:6379> SMEMBERS myset1 #查看myset1中,只有兩個元素
1) "crystalnew"
2) "crystal"
127.0.0.1:6379>
備註,同《系統學習redis之三——redis數據類型之string類型及操作》一樣,後面的例子也都在同一臺機器一次性操作完畢的,因爲後面的代碼如果不加上“ [root@test101 redis-4.0.1]# src/redis-cli ”這一句。代碼高亮也會格式有問題,所以後面所有的例子中都加上了“[root@test101 redis-4.0.1]# src/redis-cli ”,只是爲了格式問題。
2)smembers:查看指定set的所有元素
例如:查看myset1的所有元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1 #查看myset1的全部元素
1) "crystalnew"
2) "crystal"
127.0.0.1:6379>
3)srem:刪除set中指定的元素,rem即remove的縮寫
例如:刪除myset1中的crystal元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "crystalnew"
2) "crystal"
127.0.0.1:6379> SREM myset1 crystal #刪除成功,返回1
(integer) 1
127.0.0.1:6379> SMEMBERS myset1
1) "crystalnew"
127.0.0.1:6379> SREM myset1 crystal #因爲crystal已經被刪除了,所以這裏不會刪除成功,就返回0
(integer) 0
127.0.0.1:6379> SMEMBERS myset1
1) "crystalnew"
127.0.0.1:6379>
4)spop:隨機返回並刪除set中名稱爲key的一個元素
例如:隨機刪除myset1中的某個元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "crystal2"
2) "crystal3"
3) "crystal"
4) "crystalnew"
127.0.0.1:6379> SPOP myset1 #第一次刪除了crystal2
"crystal2"
127.0.0.1:6379> SMEMBERS myset1
1) "crystal3"
2) "crystal"
3) "crystalnew"
127.0.0.1:6379> SPOP myset1 #第二次刪除了crystal
"crystal"
127.0.0.1:6379> SMEMBERS myset1 #從前面兩次刪除的數據看,刪除的元素是隨機刪除的,沒有規律性
1) "crystal3"
2) "crystalnew"
127.0.0.1:6379>
5)sdiff:返回兩個指定集合的差集(即返回所有給定key與第一個key的差集)
例如:求myset1和myset3之間的差集(以寫在前面的key爲標準)
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SMEMBERS myset3
1) "two"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SDIFF myset1 myset3
1) "one" #備註:從myset1的第一個值開始和myset3比較,第一個不相同的值是one,這個是以myset1作爲參照物的。如果myset3在前面,返回的就應該是two
127.0.0.1:6379>
127.0.0.1:6379> SDIFF myset3 myset1
1) "two" #如上面的備註,因爲myset3在前面,myset3就是參照物,返回的就是和myset3不同的值
127.0.0.1:6379>
6)sdiffstore:返回所有給定key與第一個key的差集,並將結果存爲另一個key(也就是說,sdiff只能返回差集,但是不能把結果存下來,sdiffstore就能將返回的差集存下來)
例如:將上面例子中,myset1和myset3的差集並存儲到myset4裏面
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SDIFF myset1 myset3
1) "one"
127.0.0.1:6379> SDIFFSTORE myset4 myset1 myset3 #將myset1和myset3的差集並存儲到myset4裏面
(integer) 1
127.0.0.1:6379> SMEMBERS myset4
1) "one" #返回的是one,就是myset和myset3的差集
127.0.0.1:6379>
7)sinter:返回所有給定key的交集
例如:取myset1和myset3之間的交集
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SMEMBERS myset3
1) "two"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SINTER myset1 myset3
1) "crystal3"
2) "crystalnew"
127.0.0.1:6379>
8)sinterstore:返回所有給定key的交集,並將結果存爲另一個key
例如:將上面例子中myset1和myset3的交集取出,並存儲到myset5中
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SINTER myset1 myset3 #取myset1和myset3的交集
1) "crystal3"
2) "crystalnew"
127.0.0.1:6379> SINTERSTORE myset5 myset1 myset3 #去交集並存儲到myset5中
(integer) 2
127.0.0.1:6379> SMEMBERS myset5 #查看myset5的值,就是myset1和myset3的交集
1) "crystalnew"
2) "crystal3"
127.0.0.1:6379>
9)sunion:返回所有給定key的並集
例如:返回myset1和myset3的並集
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SMEMBERS myset3
1) "two"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SUNION myset1 myset3 #取並集
1) "one"
2) "crystal3"
3) "two"
4) "crystalnew"
127.0.0.1:6379>
10)sunionstore:返回所有給定key的並集,並將結果存爲另一個key
例如:將上面例子中myset1和myset3的並集取出,並存儲到myset6中
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SUNION myset1 myset3 #取並集
1) "one"
2) "crystal3"
3) "two"
4) "crystalnew"
127.0.0.1:6379> SUNIONSTORE myset6 myset1 myset3 #取並集並存儲到myset6中
(integer) 4
127.0.0.1:6379> SMEMBERS myset6 #查看myset6的值,就是myset1和myset3的並集
1) "one"
2) "crystal3"
3) "two"
4) "crystalnew"
127.0.0.1:6379>
11)smove:從第一個key對應的set中移除member並添加到第二個對應的set中
例如:將myset6裏面crystalnew元素移動到myset7裏面
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset6 #查看myset6當前的元素
1) "one"
2) "crystal3"
3) "two"
4) "crystalnew"
127.0.0.1:6379> SMEMBERS myset7 #myset7當前爲空,沒有任何元素
(empty list or set)
127.0.0.1:6379> SMOVE myset6 myset7 crystalnew #將myset6裏面crystalnew元素移動到myset7裏面
(integer) 1
127.0.0.1:6379> SMEMBERS myset6 #myset6裏面已經沒有了crystalnew這個元素
1) "one"
2) "crystal3"
3) "two"
127.0.0.1:6379> SMEMBERS myset7 #myset7裏面已經非空,有個crystalnew這個元素
1) "crystalnew"
127.0.0.1:6379>
12)scard:返回指定key的set的元素個數
例如:返回myset1的元素個數
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1 #先查看當前myset1的元素詳情
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SCARD myset1 #scar查看myset1的元素個數
(integer) 3
127.0.0.1:6379>
13)sismember:測試member是否是名稱爲key的set的元素
例如:測試元素“one”和元素“two”是否爲myset1裏面的元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SISMEMBER myset1 one #測試one是否爲myset1的元素
(integer) 1 #因爲one是myeset1裏的元素,所以返回1
127.0.0.1:6379> SISMEMBER myset1 two #測試two是否爲myset1的元素
(integer) 0 #因爲two不是myeset1裏的元素,所以返回0
127.0.0.1:6379>
14)srandmember:隨機返回名稱爲key的set的一個元素,但是不刪除元素(即隨機取指定set裏面的某個元素,而且不刪除)
例如:隨機取myset1裏面的某個元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1 #查看myset1當前所有元素
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SRANDMEMBER myset1 #第一次隨機獲取,得到的是元素crystal3
"crystal3"
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SRANDMEMBER myset1 #第二次隨機獲取,得到的是元素crystalnew3
"crystalnew"
127.0.0.1:6379> SMEMBERS myset1 #查看myset1當前所有元素,還是原來的元素,並沒有被刪除
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379>