Redis學習筆記 - 數據類型與API(4)Set

Set(集合)

特色

  • 無序
  • 無重複
  • 集合間操做

經常使用命令

命令 含義 時間複雜度
sadd 將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略 O(N), N 是被添加的元素的數量。
srem 移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略。 O(N), N 爲給定 member 元素的數量
smove 將 member 元素從 A 集合移動到 B 集合 O(1)
scard 集合中元素的數量 O(1)
sismember 判斷 member 元素是否集合 key 的成員 O(1)
smembers 返回集合 key 中的全部成員 O(N),N 爲集合的基數
srandmember 從集合中隨機挑選指定數量元素返回 O(N),N 爲返回數組的元素個數
spop 移除並返回集合中的一個隨機元素 O(1)
sdiff、sdiffstore 給定集合之間的差集(將結果保存到新的集合) O(N),N 是全部給定集合的成員數量之和。
sinter、sinterstore 給定集合之間的交集(將結果保存到新的集合) O(N * M),N 爲給定集合當中基數最小的集合,M 爲給定集合的個數。
sunion、sunionstore 給定集合之間的並集(將結果保存到新的集合) O(N), N 是全部給定集合的成員數量之和

sadd、srem

  • sadd key element1 element2 ... (向集合key添加element(若是element已經存在,則添加失敗))
  • srem key element1 element2 ... (移除key中的element元素)

scard、sismember、srandmember、smembers

  • scard key (計算集合大小)
  • sismember key element (判斷element是否在集合中)
  • srandmember key count (從集合中隨機挑選count個元素)
  • spop key(從集合中隨機彈出一個元素)
  • smembers key(獲取集合中全部元素)
127.0.0.1:6379> sadd setkey go c c++ c# php java python
(integer) 7
127.0.0.1:6379> sadd setkey go
(integer) 0
127.0.0.1:6379> sadd setkey matlab c
(integer) 1
127.0.0.1:6379> smembers setkey
1) "php"
2) "python"
3) "go"
4) "c++"
5) "matlab"
6) "java"
7) "c"
8) "c#"
127.0.0.1:6379> srem setkey c c++
(integer) 2
127.0.0.1:6379> smembers setkey
1) "matlab"
2) "java"
3) "c#"
4) "go"
5) "python"
6) "php"
127.0.0.1:6379> scard setkey
(integer) 6
127.0.0.1:6379> sismember setkey c++
(integer) 0
127.0.0.1:6379> sismember setkey php
(integer) 1
127.0.0.1:6379> srandmember setkey 3
1) "go"
2) "python"
3) "java"
127.0.0.1:6379> srandmember setkey 3
1) "go"
2) "java"
3) "c#"
127.0.0.1:6379> spop setkey
"matlab"
127.0.0.1:6379> spop setkey
"java"
127.0.0.1:6379> smembers setkey
1) "go"
2) "python"
3) "c#"
4) "php"
srandmember 和 spop: spop 從集合中彈出;srandmember 不會破壞集合

sdiff、sinter、sunion

  • sdiff setkey1 setkey2 (setkey1 setkey2的差集)
  • sinter setkey1 setkey2 (setkey1 setkey2的交集)
  • sunion setkey1 setkey2 (setkey1 setkey2的並集)
  • sdiff|sinter|suion + store destkey setkey1 setkey2 (將差集、交集、並集結果保存到destkey中)

示例見下面 實戰 中的 粉絲php

更多 Set 相關命令:http://www.redis.cn/commands....

實戰

抽獎系統

  • spop

記錄點贊,踩的用戶

標籤

  • 給用戶添加標籤
sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag3 tag4 tag5
...
sadd user:n:tags tag1 tag3 tag5
  • 給標籤添加用戶
sadd tag:1:users user1 user3
sadd tag:2:users user3 user5 user6
...
sadd tag:n:users user1 user4

粉絲

  • 關注
127.0.0.1:6379> sadd user:1:follow 2 3 5 6 8 9
(integer) 6
127.0.0.1:6379> sadd user:2:follow 1 3 5 7 8 9
(integer) 6
  • 粉絲
127.0.0.1:6379> sadd user:1:fans 2 7 9
(integer) 3
  • 我關注他,他沒關注我
127.0.0.1:6379> sdiff user:1:follow user:1:fans
1) "3"
2) "5"
3) "6"
4) "8"
  • 他關注我,我沒關注他
127.0.0.1:6379> sdiff user:1:fans user:1:follow
1) "7"
  • 互粉
127.0.0.1:6379> sinter user:1:follow user:1:fans
1) "2"
2) "9"
127.0.0.1:6379> sinterstore user:1:mutual_fans user:1:follow user:1:fans
(integer) 2
127.0.0.1:6379> smembers user:1:mutual_fans
1) "2"
3) "9"
  • 共同關注
127.0.0.1:6379> sinter user:1:follow user:2:follow
1) "3"
2) "5"
3) "8"
4) "9"
  • 可能認識的人(用戶1和用戶2關注用戶的並集)
127.0.0.1:6379> sunion user:1:follow user:2:follow
1) "1"
2) "2"
3) "3"
4) "5"
5) "6"
6) "7"
7) "8"
8) "9"

Tips

sadd = Tagging (標籤)
spop/srandmember = Random item (隨機成員)
sadd + sinter = Social Craph (社交平臺關係)

相關內容:

Redis學習筆記 - 數據類型與API(1)Key
Redis學習筆記 - 數據類型與API(2)String
Redis學習筆記 - 數據類型與API(3)List
Redis學習筆記 - 數據類型與API(4)Set
Redis學習筆記 - 數據類型與API(5)Sorted Set
Redis學習筆記 - 數據類型與API(6)Hashhtml

相關文章
相關標籤/搜索