Redis——常用数据类型Zset

Zset 有序集合

有序集合提供了获取指定分数和元素范围查找、计算成员排名等功能,合理地利用有序集合,可以帮助我们在实际开发中解决很多问题。

数据结构是否允许重复元素是否有序有序依据应用场景
列表索引下标时间轴、消息队列等
集合标签、社交等
有序集合分数排行榜系统、社交 等

这里列表的有序和有序集合的有序不是一个有序,list的有序代表的是这个顺序上的重要性,Zset代表升序降序的有序

普通命令
zadd
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]

//时间复杂度:O(log(N))
//返回值:本次添加成功的元素个数。

添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负 极限也是合法的。

ZADD 的相关选项:

  • XX:仅仅用于更新已经存在的元素,不会添加新元素。
  • NX:仅用于添加新元素,不会更新已经存在的元素。
  • CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更 新的元素的个数。
  • INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和 分数。
zcard
ZCARD key

//获取zset 中的元素个数
//时间复杂度:O(1)
//返回值:zset 内的元素个数
zcount
ZCOUNT key min max

//返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的
//时间复杂度:O(log(N))
//返回值:满⾜条件的元素列表个数
zrange
ZRANGE key start stop [WITHSCORES]

//返回指定区间⾥的元素,分数按照升序。带上 WITHSCORES 可以把分数也返回
//此处的 [start, stop] 为下标构成的区间. 从 0 开始, ⽀持负数
//时间复杂度:O(log(N)+M)
//返回值:区间内的元素列表
zrevrange
ZREVRANGE key start stop [WITHSCORES]

//返回指定区间⾥的元素,分数按照降序。带上 WITHSCORES 可以把分数也返回
//时间复杂度:O(log(N)+M)
//返回值:区间内的元素列表
zrangebyscore
ZRANGEBYSCORE key min max [WITHSCORES]

//返回分数在 min 和 max 之间的元素,默认情况下,min 和 max 都是包含的
//时间复杂度:O(log(N)+M)
//返回值:区间内的元素列表
zpopmax
 ZPOPMAX key [count]

//删除并返回分数最⾼的 count 个元素
//时间复杂度:O(log(N) * M)
//返回值:分数和元素列表
bzpopmax
BZPOPMAX key [key ...] timeout

//ZPOPMAX 的阻塞版本
//时间复杂度:O(log(N))
//返回值:元素列表
zpopmin
ZPOPMIN key [count]

//删除并返回分数最低的 count 个元素
//时间复杂度:O(log(N) * M)
//返回值:分数和元素列表
bzpopmin
BZPOPMIN key [key ...] timeout

//ZPOPMIN 的阻塞版本
//时间复杂度:O(log(N))
//返回值:元素列表
zrank
ZRANK key member

//返回指定元素的排名,升序
//时间复杂度:O(log(N))
//返回值:排名
zrevrank
ZREVRANK key member

//返回指定元素的排名,降序
//时间复杂度:O(log(N))
//返回值:排名
zscore
ZSCORE key member

//返回指定元素的分数
//时间复杂度:O(1)
//返回值:分数
zrem
ZREM key member [member ...]

//删除指定的元素
//时间复杂度:O(M*log(N))
//返回值:本次操作删除的元素个数
zremrangebyrank
ZREMRANGEBYRANK key start stop

//按照排序,升序删除指定范围的元素,左闭右闭
//时间复杂度:O(log(N)+M)
//返回值:本次操作删除的元素个数
zremrangebyscore
ZREMRANGEBYSCORE key min max

//按照分数删除指定范围的元素,左闭右闭
//时间复杂度:O(log(N)+M)
//返回值:本次操作删除的元素个数
zincrby
ZINCRBY key increment member

//为指定的元素的关联分数添加指定的分数值
//时间复杂度:O(log(N))
//返回值:增加后元素的分数
集合间操作

有序集合的交集操作

zinterstore
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight
[weight ...]] [AGGREGATE <SUM | MIN | MAX>]

//求出给定有序集合中元素的交集并保存进⽬标有序集合中,在合并过程中以元素为单位进行合并,
//元素对应的分数按照不同的聚合⽅式和权重得到新的分数

//时间复杂度:O(N*K)+O(M*log(M)) N 是输⼊的有序集合中, 最⼩的有序集合的元素个数; K 是输⼊了
//⼏个有序集合; M 是最终结果的有序集合的元素个数.
//返回值:⽬标集合中的元素个数

有序集合的并集操作

zunionstore
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight
 [weight ...]] [AGGREGATE <SUM | MIN | MAX>]

//求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进行合并,
//元素对应的分数按照不同的聚合⽅式和权重得到新的分数

//时间复杂度:O(N)+O(M*log(M)) N 是输⼊的有序集合总的元素个数; M 是最终结果的有序集合的元素个数.
//返回值:⽬标集合中的元素个数
Zset的编码方式
  • ziplist(压缩列表):当有序集合的元素个数小于 zset-max-ziplist-entries 配置(默认 128 个),同时每个元素的值都小于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会用 ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使用
  • skiplist(跳表):当 ziplist 条件不满足时,有序集合会使用 skiplist 作为内部实现,因为此时 ziplist 的操作效率会下降。”
  1. 当元素个数较少且每个元素较小时,内部编码为 ziplist
  2. 当元素个数超过 128 个,内部编码 skiplist
  3. 当某个元素大于 64 字节时,内部编码 skiplist
Zset的应用场景

有序集合比较典型的使用场景就是排行榜系统

  1. 添加用户赞数
  2. 取消用户赞数
  3. 展示获取赞数最多的 10 个用户
  4. 展示用户信息以及用户分数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚安刘十三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值