Redis 的 Set(集合)是 string(字符串)类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 的集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。因此,可以使用 Redis 的 Set(集合)高效地做如下事情:
(1)跟踪唯一项目(例如,跟踪访问给定博客文章的所有唯一IP地址)
(2)表示关系(例如,具有给定角色的所有用户的集合)
(3)执行常见的集合操作,如交集、并集和差集
注意:集合中最大的成员数为 2^32 - 1 (4294967295,每个集合可存储 40 多亿个成员)。大多数集合操作,包括添加、删除和检查项是否为集合成员,都是 O(1),这意味着他们的效率很高。但是,对于具有数十万或更多成员的大型集合,在运行 SMEMBERS 命令时应谨慎。此命令为 O(n),并在单个响应中返回整个集合。作为替代方案,考虑 SSCAN,它允许您迭代检索集合的所有成员。
(1)存储用户 123 和 456 的收藏图书ID集,如下:
127.0.0.1:6379> SADD user:123:favorites 347 (integer) 1 127.0.0.1:6379> SADD user:123:favorites 561 (integer) 1 127.0.0.1:6379> SADD user:123:favorites 742 (integer) 1 127.0.0.1:6379> SADD user:456:favorites 561 (integer) 1
(2)检查用户 123 是否喜欢图书 742 和 299,如下:
127.0.0.1:6379> SISMEMBER user:123:favorites 742 (integer) 1 127.0.0.1:6379> SISMEMBER user:123:favorites 299 (integer) 0
(3)用户 123 和 456 有共同喜欢的书吗?
127.0.0.1:6379> SINTER user:123:favorites user:456:favorites 1) "561"
(4)用户 123 偏爱了多少本书?
127.0.0.1:6379> SCARD user:123:favorites (integer) 3
下面列出了 Redis 集合基本命令。
向集合添加一个或多个成员。语法如下:
SADD key member1 [member2]
实例:
127.0.0.1:6379> sadd set:mykey 100 200 200 300 (integer) 3 127.0.0.1:6379> smembers set:mykey 1) "100" 2) "200" 3) "300"
获取集合的成员数。语法如下:
SCARD key
实例:
127.0.0.1:6379> sadd set:mykey 100 200 200 300 (integer) 3 127.0.0.1:6379> scard set:mykey (integer) 3
返回第一个集合与其他集合之间的差异。语法如下:
SDIFF key1 [key2]
实例:
127.0.0.1:6379> sadd set:key1 100 200 300 (integer) 3 127.0.0.1:6379> sadd set:key2 100 200 (integer) 2 127.0.0.1:6379> sdiff set:key1 set:key2 1) "300"
返回给定所有集合的差集并存储在 destination 中。语法如下:
SDIFFSTORE destination key1 [key2]
实例:
127.0.0.1:6379> sadd set:key1 100 200 300 (integer) 3 127.0.0.1:6379> sadd set:key2 100 200 (integer) 2 127.0.0.1:6379> sdiffstore set:result set:key1 set:key2 (integer) 1 127.0.0.1:6379> smembers set:result 1) "300"
返回给定所有集合的交集。语法如下:
SINTER key1 [key2]
实例:
127.0.0.1:6379> sadd set:key1 100 200 300 (integer) 3 127.0.0.1:6379> sadd set:key2 100 200 (integer) 2 127.0.0.1:6379> sinter set:key1 set:key2 1) "100" 2) "200"
返回给定所有集合的交集并存储在 destination 中。语法如下:
SINTERSTORE destination key1 [key2]
实例:
127.0.0.1:6379> sadd set:key1 100 200 300 (integer) 3 127.0.0.1:6379> sadd set:key2 100 200 (integer) 2 127.0.0.1:6379> sinterstore set:result set:key1 set:key2 (integer) 2 127.0.0.1:6379> smembers set:result 1) "100" 2) "200"
判断 member 元素是否是集合 key 的成员。语法如下:
SISMEMBER key member
实例:
127.0.0.1:6379> smembers set:mykey 1) "100" 2) "200" 3) "300" 127.0.0.1:6379> sismember set:mykey 200 (integer) 1 127.0.0.1:6379> sismember set:mykey 400 (integer) 0
返回集合中的所有成员。语法如下:
SMEMBERS key
实例:
127.0.0.1:6379> sadd set:mykey 100 200 300 (integer) 3 127.0.0.1:6379> smembers set:mykey 1) "100" 2) "200" 3) "300"
将 member 元素从 source 集合移动到 destination 集合。语法如下:
SMOVE source destination member
实例:
127.0.0.1:6379> smembers set:key1 1) "100" 2) "200" 3) "300" 127.0.0.1:6379> smembers set:key2 1) "100" 2) "200" 127.0.0.1:6379> smove set:key1 set:key2 300 (integer) 1 127.0.0.1:6379> smembers set:key2 1) "100" 2) "200" 3) "300"
移除并返回集合中的一个随机元素。语法如下:
SPOP key
实例:
127.0.0.1:6379> smembers set:mykey 1) "100" 2) "200" 3) "300" 127.0.0.1:6379> spop set:mykey 1 1) "100" 127.0.0.1:6379> smembers set:mykey 1) "200" 2) "300"
返回集合中一个或多个随机数。语法如下:
SRANDMEMBER key [count]
实例:
127.0.0.1:6379> smembers set:mykey 1) "100" 2) "200" 3) "300" 127.0.0.1:6379> srandmember set:mykey 1 1) "200" 127.0.0.1:6379> smembers set:mykey 1) "100" 2) "200" 3) "300"
移除集合中一个或多个成员。语法如下:
SREM key member1 [member2]
实例:
127.0.0.1:6379> smembers set:mykey 1) "100" 2) "200" 3) "300" 127.0.0.1:6379> srem set:mykey 100 300 (integer) 2 127.0.0.1:6379> smembers set:mykey 1) "200"
返回所有给定集合的并集。语法如下:
SUNION key1 [key2]
实例:
127.0.0.1:6379> smembers set:key1 1) "100" 2) "200" 127.0.0.1:6379> smembers set:key2 1) "100" 2) "200" 3) "300" 127.0.0.1:6379> sunion set:key1 set:key2 1) "100" 2) "200" 3) "300"
所有给定集合的并集存储在 destination 集合中。语法如下:
SUNIONSTORE destination key1 [key2]
实例:
127.0.0.1:6379> smembers set:key1 1) "100" 2) "200" 127.0.0.1:6379> smembers set:key2 1) "100" 2) "200" 3) "300" 127.0.0.1:6379> sunionstore set:result set:key1 set:key2 (integer) 3 127.0.0.1:6379> smembers set:result 1) "100" 2) "200" 3) "300"
迭代集合中的元素。语法如下:
SSCAN key cursor [MATCH pattern] [COUNT count]
实例:
127.0.0.1:6379> sadd set:mykey "google.com" "baidu.com" "ping.com" "oracle.com" (integer) 4 127.0.0.1:6379> smembers set:mykey 1) "ping.com" 2) "baidu.com" 3) "google.com" 4) "oracle.com" 127.0.0.1:6379> sscan set:mykey 0 match "*g*" 1) "0" 2) 1) "google.com" 2) "ping.com"
更多命令请访问 https://redis.io/commands 进行参考。