redis(2)-api-set

集合(set) 类型也是用来保存多个的字符串元素, 但和列表类型不一样的是, 集合中不允许有重复元素, 并且集合中的元素是无序的, 不能通过索引下标获取元素。 如图2-22所示, 集合user: 1: follow包含着"it"、 “music”、 “his”、 "sports"四个元素, 一个集合最多可以存储232-1个元素。 Redis除了支持集合内的增删改查, 同时还支持多个集合取交集、 并集、 差集, 合理地使用好集合类型, 能在实际开发中解决很多实际问题。
redis(2)-api-set
下面将按照集合内和集合间两个维度对集合的常用命令进行介绍。
1.集合内操作
(1) 添加元素
sadd key element [element …]
返回结果为添加成功的元素个数

(2) 删除元素
srem key element [element …]
返回结果为成功删除元素个数

(3) 计算元素个数
scard key
scard的时间复杂度为O(1) , 它不会遍历集合所有元素, 而是直接用Redis内部的变量。

(4) 判断元素是否在集合中
sismember key element
如果给定元素element在集合内返回1, 反之返回0。

(5) 随机从集合返回指定个数元素
srandmember key [count]
[count]是可选参数, 如果不写默认为1

(6) 从集合随机弹出元素
spop key
spop操作可以从集合中随机弹出一个元素。

需要注意的是Redis从3.2版本开始, spop也支持[count]参数。srandmember和spop都是随机从集合选出元素, 两者不同的是spop命令执行后, 元素会从集合中删除, 而srandmember不会。

获取所有元素
smembers key
下面代码获取集合myset所有元素, 并且返回结果是无序的。

smembers和lrange、 hgetall都属于比较重的命令, 如果元素过多存在阻塞Redis的可能性, 这时候可以使用sscan来完成。

2.集合间操作
(1)求多个集合的交集
sinter key [key …]

(2) 求多个集合的并集
suinon key [key …]

(3) 求多个集合的差集
sdiff key [key …]
注意 这里的差集时指的是第一个集合和后面几个集合的差集,并不是所有的差集。
例如
s1{a,b,c} s2{b} s3{c}
sdiff s1 s2 s3
a

(4) 将交集、 并集、 差集的结果保存
sinterstore destination key [key …]
suionstore destination key [key …]
sdiffstore destination key [key …]
集合间的运算在元素较多的情况下会比较耗时, 所以Redis提供了上面三个命令(原命令+store) 将集合间交集、 并集、 差集的结果保存在destination key中。

内部编码
集合类型的内部编码有两种
1.intset(整数集合) : 当集合中的元素都是整数且元素个数小于set-maxintset-entries配置(默认512个) 时, Redis会选用intset来作为集合的内部实现, 从而减少内存的使用。
2.hashtable(哈希表) : 当集合类型无法满足intset的条件时, Redis会使用hashtable作为集合的内部实现