集合(set)类型也是用来保存多个字符串元素的,但是和列表不一样的是,集合中不允许有重复元素,并且集合中元素是无序的,不能通过索引下标获取元素。
一个集合最多可以存储2^32 - 1个元素,Redis除了支持集合的增删改查,同时还支持多个集合取交集,并集,差集。
命令:
-- 添加元素
sadd key element [element...] 返回添加成功的元素个数
-- 删除元素
srem key element [element...] 返回成功删除元素个数
-- 计算元素个数
scard key
scard 的时间复杂度为O(1),他不会遍历集合所有元素,而是直接用Redis内部的变量
-- 判断元素是否在集合中
sismember key element
-- 随机从集合返回指定个数元素
srandmember key [count]
[count]可选项,如果不写默认为1
-- 随机从集合中弹出元素
spop key
Redis 3.2之后,spop 也支持[count] 参数。
srandmember和spop都是随机从集合选出元素,两者不同的是spop命令执行后,元素会从集合中删除,而srandmember不会。
-- 获取所有元素
smembers key
注意:smembers 和 lrange、hgetall都属于比较重的命令,元素过多,可能会阻塞Redis,可以用sscan来完成
集合间操作:
-- 求多个集合的交集
sinter key [key...]
-- 求多个集合的并集
sunion key [key...]
-- 求多个集合的差集
sdiff key [key...]
-- 将交集、并集、差集的结果保存
sinterstore destination key [key...]
sunionstore destination key [key...]
sdiffstore destination key [key...]
内部编码:
-- intset(整数集合):当集合汇总元素都是整数且元素个数小于set-max-intset-entries配置(默认512)时,Redis会选用intset来作为集合的内部实现,而减少内存使用
-- hashtable(哈希表):当集合类型无法满足intset要求的时候,Redis会使用hashtable作为集合的内部实现
网友评论