当前位置: 首页 > news >正文

Redis有序集合:高效排行榜实现方案

Zset有序集合

有序集合相对于字符串、列表、哈希、集合来说有一些陌生。它保留了集合不能有重复成员的特点,但和集合不同的是,有序集合中的每个元素都有一个唯一的浮点数类型的分数与之关联,使得有序集合中的元素是可以维护有序性的,单着恶搞有序不是用下表作为排序依据而是用这个分数。

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

有序集合中的元素不能重复,但是分数允许重复。

普通命令

ZADD

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

ZADD的相关选项

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

语法:

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]

时间复杂度:O(log(n))

返回值:本次添加成功的元素个数

举个例子:

ZCARD

获取一个zset得到基数,即zset中的元素个数

语法:

ZCARD key

时间复杂度:O(1)

返回值:zset内的元素个数

举个例子:

ZCOUNT

返回分数在min和max之间的元素个数,默认情况下,min和max都是包含的,可以通过(排除。

语法:

ZCOUNT key min max

时间复杂度:O(log(N))

返回值:满足条件的元素列表个数

ZRANGE

返回指定区间里的元素,分数按照升序。带上WITHSCORES可以把分数也返回

语法:

ZRANGE key start stop [WITHSCORES]

时间复杂度:O(log(N)+M)

返回值:区间内的元素列表

举个例子:

ZREVRANGE

返回指定区间里的元素,分数按照降序。带上WITHSCORES可以把分数也返回

语法:

ZREVRANGE key start stop [WITHSCORES]

时间复杂度:O(log(N)+M)

返回值:区间内的元素列表

ZRANGEBYSCORE

返回分数在min和max之间的元素,默认情况下,min和max都是包含的,可以通过(排除。

语法:

ZRANGEBYSCORE key min max [WITHSCORES]

时间复杂度:O(log(N)+M)

返回值:区间内的元素列表

ZPOPMAX

删除并返回分数最高的count个元素

语法:

ZPOPMAX key [count]

时间复杂度:O(log(N)*M)

返回值:分数和元素列表

举个例子:

BZPOPMAX

ZPOPMAX的阻塞版本

语法:

BZPOPMAX key [key ...] timeout

时间复杂度:O(log(N))

返回值:元素列表

举个例子:

ZPOPMIN

删除并返回分数最低的count个元素

语法:

ZPOPMIN key [count]

时间复杂度:O(log(N)*M)

返回值:分数和元素列表

举个例子:

BZPOPMIN

ZPOPMIN的阻塞版本

语法:

BZPOPMIN key [key ...] timeout

时间复杂度:O(log(N))

返回值:元素列表

举个例子:

ZRANK

返回指定元素的排名,升序

语法:

ZRANK key member

时间复杂度:O(log(N))

返回值:排名

举个例子:

ZREVRANK

返回执行元素的排名,降序

时间复杂度:O(log(N))

返回值:排名

ZSCORE

返回指定元素的分数

时间复杂度: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))

返回值:增加后元素的分数

集合之间的操作

有序集合的交集操作
ZINTERSTOR
求出给定有序集合中元素的交集并保存到目标有序集合中,在合并过程中以元素为单位进行合并,元素对应的分数按照不同的聚合方式和权重得到新的分数。
时间复杂度:O(N*K)+O(M*log(M)) N 是输⼊的有序集合中, 最⼩的有序集合的元素个数; K 是输⼊了⼏个有序集合; M 是最终结果的有序集合的元素个数.
返回值:目标集合中的元素个数
举个例子:
有序集合的并集操作
ZUNIONSTORE
求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。
时间复杂度:O(N)+O(M*log(M)) N 是输⼊的有序集合总的元素个数; M 是最终结果的有序集合的元素个数
返回值:目标集合中的元素个数
举例子:

命令小结

内部编码

有序集合类型的内部编码有两种

  • ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置,同时每个元素的值都小于zset-max-ziplist-value配置时,Reids会使用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用
  • skiplist(跳表):当ziplist条件不满足的时候,有序集合会使用ziplist作为内部实现,因为此时ziplist的操作效率会下降

使用场景

有序集合⽐较典型的使⽤场景就是排⾏榜系统。例如常⻅的⽹站上的热榜信息,榜单的维度可能
是多⽅⾯的:按照时间、按照阅读量、按照点赞量。
http://www.dtcms.com/a/410756.html

相关文章:

  • 专门做化妆的招聘网站新手要如何让网站被收录
  • Gli appunti di scienza dei dati[5]
  • 【mdBook】1 安装
  • 唐山网站建设费用廊坊市做网站的公司有哪些
  • AI大模型学习(16)AI大模型在电商行业的一些应用(淘宝的以图搜图技术)
  • 【日常学习】UI自动化自定义异常类
  • 个人项目开发经验总结:从实践中提炼的宝贵心得
  • Linux条件变量:pthread_cond_init、pthread_cond_wait等函数详解
  • HashMap的api使用详解
  • IS-IS核心解析:驱动现代网络的隐形力量
  • Unity地面震动的效果
  • Unity Shader变体管理最佳实践
  • 网站开发目的重庆建设工程信息网 官网
  • 镇江网站排名优化费用wordpress推广积分插件
  • 基于51单片机的自习室人数统计系统
  • C4D口红建模核心技巧:优质布线的思路与操作方法
  • 虚拟机管理程序(Hypervisor)
  • 黑盒测试和白盒测试
  • iree 上运行qwen2.5 05b运行效率
  • dw手机网站怎么做软文推广代理平台
  • qq刷赞网站推广软件广告机 东莞网站建设
  • 佛山网站建设原创网站底部版权信息
  • Unity / C# 开发常见问题总结(闭包、协程、事件、GC 等易踩坑)
  • C# 集合框架完全指南:从IEnumerable到ObservableCollection的深度解析
  • 用户研究:用户研究和数据分析的根本联系与区别
  • 网站关键词优化培训jeecg 3.7 网站开发
  • 右键菜单增强工具,自定义系统功能
  • 图像分类入门:从数据到模型的深度学习核心知识解析
  • 攻防世界-Web-PHP2
  • Windows系统Web UI自动化测试学习系列3--浏览器驱动下载使用