Redis数据结构---集合

集合(set) 类型也是用来保存多个的字符串元素, 但和列表类型不一样的是, 集合中不允许有重复元素, 并且集合中的元素是无序的, 不能通过索引下标获取元素

一个集合最多可以存储232-1个元素。

Redis除了支持集合内的增删改查,同时还支持多个集合取交集、 并集、 差集,合理地使用好集合类型,能在实际开发中解决很多实际问题

常用命令

添加元素
sadd key element [element ...]

删除元素
srem key element [element ...]

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

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

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

从集合随机弹出元素
spop key [count]
注:srandmember和spop都是随机从集合选出元素, 两者不同的是spop命令执行后, 元素会从集合中删除, 而srandmember不会。

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


求多个集合的交集
sinter key [key ...]

求多个集合的并集
suinon key [key ...]

求多个集合的差集
sdiff key [key ...]

将交集、 并集、 差集的结果保存
sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...]

命令复杂度

内部编码

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

使用场景

集合类型比较典型的使用场景是标签(tag

集合类型的应用场景通常为以下几种:

·sadd=Tagging(标签)
·spop/srandmember=Random item(生成随机数, 比如抽奖)
·sadd+sinter=Social Graph(社交需求)
原文地址:https://www.cnblogs.com/MacoLee/p/13960078.html