集合(set) 类型也是用来保存多个的字符串元素, 但和列表类型不一样的是, 集合中不允许有重复元素, 并且集合中的元素是无序的, 不能通过索引下标获取元素。
一个集合最多可以存储232-1个元素。 Redis除了支持集合内的增删改查, 同时还支持多个集合取交集、 并集、 差集, 合理地使用好集合类型
sadd key element [element ...]
smembers key
返回结果是无序的
srem key element [element ...]
scard key
sismember key element
如果给定元素 element 在集合内返回1, 反之返回0
srandmember key [count]
[count] 是可选参数, 如果不写默认为1
spop key
spop操作可以从集合中随机弹出一个元素,并在执行后将该元素从集合中删除
Redis从3.2版本开始, spop也支持[count]参数
sinter key [key ...]
求交集并保存结果到另一个集合
sinterstore destination key [key ...]
sunion key [key ...]
求并集并保存结果到另一个集合
suionstore destination key [key ...]
sdiff key [key ...]
求差集并保存结果到另一个集合
sdiffstore destination key [key ...]
intset(整数集合) : 当集合中的元素都是整数且元素个数小于set-maxintset-entries配置(默认512个) 时, Redis会选用intset来作为集合的内部实现, 从而减少内存的使用。
当元素个数较少且都为整数时, 内部编码为intset
hashtable(哈希表) : 当集合类型无法满足intset的条件时, Redis会使用hashtable作为集合的内部实现
当元素个数超过512个, 内部编码变为hashtable
当某个元素不为整数时, 内部编码也会变为hashtable
sadd=Tagging(标签)
spop/srandmember=Random item(生成随机数, 比如抽奖)
sadd+sinter=Social Graph(社交需求)
有序集合保留了集合不能有重复成员的特性,但不同的是, 有序集合中的元素可以排序。 但是它和列表使用索引下标作为排序依据不同的是, 它给每个元素设置一个分数(score) 作为排序的依据。
有序集合中的元素不能重复, 但是score可以重复
zadd key score member [score member ...]
Redis3.2为zadd命令添加了nx、 xx、 ch、 incr四个选项:
nx: member必须不存在, 才可以设置成功, 用于添加。
xx: member必须存在, 才可以设置成功, 用于更新。
ch: 返回此次操作后, 有序集合元素和分数发生变化的个数
incr: 对score做增加, 相当于后面介绍的zincrby。
zcard key
zscore key member
正序排名
zrank key member
逆序排名
zrevrank key member
zrem key member [member ...]
zincrby key increment member
正序
zrange key start end [withscores]
逆序
zrevrange key start end [withscores]
正序
zrangebyscore key min max [withscores] [limit offset count]
逆序
zrevrangebyscore key max min [withscores] [limit offset count]
withscores 选项会同时返回每个成员的分数。
[limit offset count] 选项可以限制输出的起始位置和个数
同时 min 和 max 还支持开区间( 小括号) 和闭区间( 中括号) , -inf 和 +inf 分别代表无限小和无限大
zrangebyscore seqset (1 (3 WITHSCORES
zrangebyscore seqset (1 +inf WITHSCORES
zremrangebyscore key min max
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
destination: 交集计算结果保存到这个键。
numkeys: 需要做交集计算键的个数。
key[key...]: 需要做交集计算的键。
weights weight[weight...]: 每个键的权重, 在做交集计算时, 每个键中的每个member会将自己分数乘以这个权重, 每个键的权重默认是1。
aggregate sum|min|max: 计算成员交集后, 分值可以按照sum( 和) 、min( 最小值) 、 max( 最大值) 做汇总, 默认值是sum。
ziplist(压缩列表) : 当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个) , 同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节) 时, Redis会用ziplist来作为有序集合的内部实现, ziplist可以有效减少内存的使用。
当元素个数较少且每个元素较小时, 内部编码为skiplist
skiplist(跳跃表) : 当ziplist条件不满足时, 有序集合会使用skiplist作为内部实现, 因为此时ziplist的读写效率会下降。
当元素个数超过128个, 内部编码变为 ziplist
当某个元素大于64字节时, 内部编码也会变为 skiplist
参考资料:《Redis 开发与运维》