系統學習redis之六——redis數據類型之set數據類型及操作

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> 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章