Set(集合)
可以理解为一堆值不重复的列表,类似数学领域中的集合概念,且Redis也提供了针对集合的求交集、并集、差集等操作。
set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
应用场景
Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
又或者在微博应用中,每个用户关注的人存在一个集合中,就很容易实现求两个人的共同好友功能。
相关命令
- SADD
SADD key member [member ...] 添加一个或者多个元素到集合(set)里 - SACRD
SCARD key 获取集合里面的元素数量 - SDIFF
SDIFF key [key ...] 获得队列不存在的元素 - SDIFFSTORE
SDIFFSTORE destination key [key ...] 获得队列不存在的元素,并存储在一个关键的结果集 - SINTER
SINTER key [key ...] 获得两个集合的交集 - SINTERSTORE
SINTERSTORE destination key [key ...] 获得两个集合的交集,并存储在一个集合中 - SISMEMBER
SISMEMBER key member 确定一个给定的值是一个集合的成员 - SMEMBERS
SMEMBERS key 获取集合里面的所有key - SMOVE
SMOVE source destination member 移动集合里面的一个key到另一个集合 - SPOP
SPOP key [count] 获取并删除一个集合里面的元素 - SRANDMEMBER
SRANDMEMBER key [count] 从集合里面随机获取一个元素 - SREM
SREM key member [member ...] 从集合里删除一个或多个元素,不存在的元素会被忽略 - SUNION
SUNION key [key ...] 添加多个set元素 - SUNIONSTORE
SUNIONSTORE destination key [key ...] 合并set元素,并将结果存入新的set里面 - SSCAN
SSCAN key cursor [MATCH pattern] [COUNT count] 迭代set里面的元素
使用示例
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SMEMBERS myset
1) "World"
2) "Hello"
redis> SADD myset "one"
(integer) 1
redis> SISMEMBER myset "one"
(integer) 1
redis> SISMEMBER myset "two"
(integer) 0
使用集合数据结构的典型用例是朋友名单的实现:
redis 127.0.0.1:6379> sadd friends:leto ghanima paul chani jessica
(integer) 4
redis 127.0.0.1:6379> sadd friends:duncan paul jessica alia
(integer) 3
redis 127.0.0.1:6379> sismember friends:leto jessica
(integer) 1 #不管一个用户有多少个朋友,我们都能高效地(O(1)时间复杂度)识别出用户X是不是用户Y的朋友
redis 127.0.0.1:6379> sismember friends:leto vladimir
(integer) 0
redis 127.0.0.1:6379> sinter friends:leto friends:duncan #我们可以查看两个或更多的人是不是有共同的朋友
1) "paul"
2) "jessica"
redis 127.0.0.1:6379> sinterstore friends:leto_duncan friends:leto friends:duncan # 可以在一个新的关键字里存储结果
(integer) 2