Redis——常用数据类型Zset

ops/2024/10/22 12:33:15/

目录

      • Zset 有序集合
        • 普通命令
          • zadd
          • zcard
          • zcount
          • zrange
          • zrevrange
          • zrangebyscore
          • zpopmax
          • bzpopmax
          • zpopmin
          • bzpopmin
          • zrank
          • zrevrank
          • zscore
          • zrem
          • zremrangebyrank
          • zremrangebyscore
          • zincrby
        • 集合间操作
          • zinterstore
          • zunionstore
        • Zset的编码方式
        • 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. 展示用户信息以及用户分数

http://www.ppmy.cn/ops/112845.html

相关文章

[数据集][目标检测]俯拍航拍森林火灾检测数据集VOC+YOLO格式6116张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6116 标注数量(xml文件个数)&#xff1a;6116 标注数量(txt文件个数)&#xff1a;6116 标注…

新手学习Python第十一天,准备今天全部学完系列

——早上07&#xff1a;30到达实验室&#xff0c;开始学习&#xff0c;中秋小长假已过&#xff0c;心已收—— 一、__new__与__init__创建对象的过程 class Person(object):def __new__(cls,*args,**kwargs): *表示位置参数&#xff0c;**表示关键字参数print(__new__被调用…

go-map系统学习

map底层结构 Goland的map的底层结构使用hash实现&#xff0c;一个hash表里有多个hash表节点&#xff0c;即bucket&#xff0c;每个bucket保存了map中的一个或者一组键值对。 map结构定义&#xff1a; runtime/map.go:hmap type hmap struct {// Note: the format of the hma…

slf4j依赖冲突处理

文章目录 使用logback输出日志项目依赖兼容使用log4j(v1)的代码兼容使用jcl的代码兼容使用log4j(v2)的代码 使用log4j(v2)输出日志项目依赖兼容使用log4j(v1)的代码兼容使用jcl的代码兼容使用logback的代码 为了所有代码的日志统一使用一个配置来控制输出&#xff0c;需要进行日…

MATLAB中的代码覆盖测试:深入指南与实践应用

在软件测试领域&#xff0c;代码覆盖测试是一种重要的技术&#xff0c;用于评估测试用例的完整性和有效性。在MATLAB环境中&#xff0c;代码覆盖测试可以帮助开发者确保他们的代码在各种条件下都能正常工作&#xff0c;并且能够发现可能被忽视的错误。本文将详细介绍如何在MATL…

Java入门程序-HelloWorld

Java程序开发的三个步骤 1.编写代码得到 .java 源代码文件 2.使用javac编译得到 .class 字节码文件 3.使用java运行 注意事项 建议代码文件名全英文&#xff0c;首字母大写&#xff0c;满足驼峰命名法&#xff0c;源代码文件的后缀必须是.java 开发HelloWorld程序 &…

MYSQL数据库基础篇——DDL

DDL&#xff1a;DDL是数据定义语言&#xff0c;用来定义数据库对象。 一.DDL操作数据库 1.查询 ①查询所有数据库 输入&#xff1b; 得到结果&#xff1a; ②查询当前数据库 输入&#xff1b; 例如执行下面语句&#xff1a; 2.创建 输入 然后展示数据库即可得到结果&…

初写MySQL四张表:(3/4)

我们已经完成了四张表的创建&#xff0c;学会了创建表和查看表字段信息的语句。 初写MySQL四张表:(1/4)-CSDN博客 初写MySQL四张表:(2/4)-CSDN博客 接下来&#xff0c;我们来学点对数据的操作&#xff1a;增 删 查&#xff08;一部分&#xff09;改 先来看这四张表以及相关…