[Redis][Zset]详细讲解

目录

  • 0.前言
  • 1.常见命令
    • 1.ZADD
    • 2.ZCARD
    • 3.ZCOUNT
    • 4.ZRANGE
    • 5.ZREVRANGE
    • 6.ZRANGEBYSCORE
    • 7.ZPOPMAX
    • 8.BZPOPMAX
    • 9.ZPOPMIN
    • 10.BZPOPMIN
    • 11.ZRANK
    • 12.ZREVRANK
    • 13.ZSCORE
    • 14.ZREM
    • 15.ZREMRANGEBYRANK
    • 16.ZREMRANGEBYSCORE
    • 17.ZINCRBY
  • 2.集合间操作
    • 1.有序集合的交集操作
    • 2.ZINTERSTORE
    • 3.有序集合的并集操作
    • 4.ZUNIONSTORE
  • 3.内部编码
    • 1.ziplist(压缩链表)
    • 2.skiplist(跳表)
  • 4.使用场景


0.前言

  • 它保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,这使得有序集合中的元素是可以维护有序性的,但这个有序不是⽤下标作为排序依据⽽是⽤这个分数

    • 注意
      • zset内部是按照升序方式来排列的
      • 如果score相同,则按照元素自身字符串的字典序来排列
        请添加图片描述
  • 有序集合提供了获取指定分数和元素范围查找、计算成员排名等功能,合理地利⽤有序集合,可 以帮助在实际开发中解决很多问题

    • 对于ZSET来说,既可以通过member找到对应的score,也可以通过score找到匹配的member
  • 有序集合中的元素是不能重复的,但分数允许重复
    请添加图片描述


1.常见命令

1.ZADD

  • 功能添加或者更新指定的元素以及关联的分数到zset中,分数应该符合double类型,+inf/-inf作为正负极限也是合法的
  • 语法ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
  • 相关选项
    • XX:仅仅用于更新已经存在的元素,不会添加新元素
    • NX:仅用于添加新元素,不会更新已经存在的元素
    • LT:新score小于当前score,则更新
    • GT:新score大于当前score,则更新
    • CH:默认情况下,ZADD返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数
    • INCR:此时命令类似ZINCRBY的效果,将元素的分数加上指定的分数。此时只能指定一个元素和分数
  • 返回值:本次添加成功的元素个数
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

2.ZCARD

  • 功能:获取一个zset的计数(cardinality),即zset中的元素个数
  • 语法ZCARD key
  • 返回值zset内的元素个数
  • 时间复杂度 O ( 1 ) O(1) O(1)

3.ZCOUNT

  • 功能:返回分数在minmax之间的元素个数
    • 默认情况下,minmax都是包含的,可以通过(排除 -> 表示开区间
    • 左右区间都只能用(排除,而不是左区间用(,右区间用)
  • 语法ZCOUNT key min max
  • 返回值:满足条件的元素列表个数
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

4.ZRANGE

  • 功能:返回指定区间⾥的元素,分数按照升序,带上WITHSCORES可以把分数也返回
  • 语法ZRANGE key start stop [WITHSCORES]
  • 返回值:区间内的元素列表
  • 时间复杂度 O ( l o g ( N ) + M ) O(log(N) + M) O(log(N)+M)

5.ZREVRANGE

  • 功能:返回指定区间⾥的元素,分数按照降序,带上WITHSCORES可以把分数也返回
    • 注意:这个命令可能在6.2.0之后废弃,并且功能合并到ZRANGE
  • 语法ZREVRANGE key start stop [WITHSCORES]
  • 返回值:区间内的元素列表
  • 时间复杂度 O ( l o g ( N ) + M ) O(log(N) + M) O(log(N)+M)

6.ZRANGEBYSCORE

  • 功能:返回分数在minmax之间的元素,默认情况下,minmax都是包含的,可以通过(排除
    • 注意:这个命令可能在6.2.0之后废弃,并且功能合并到ZRANGE
  • 语法ZRANGEBYSCORE key min max [WITHSCORES]
  • 返回值:区间内的元素列表
  • 时间复杂度 O ( l o g ( N ) + M ) O(log(N) + M) O(log(N)+M)

7.ZPOPMAX

  • 功能:删除并返回分数最高的count个元素
  • 语法ZPOPMAX key [count]
  • 返回值:分数和元素列表
  • 时间复杂度 O ( l o g ( N ) ∗ M ) O(log(N) * M) O(log(N)M)

8.BZPOPMAX

  • 功能ZPOPMAX的阻塞版本
  • 语法BZPOPMAX key [key ...] timeout
    • timeout:单位为秒,支持浮点数
  • 返回值:元素列表
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

9.ZPOPMIN

  • 功能:删除并返回分数最低的count个元素
  • 语法ZPOPMIN key [count]
  • 返回值:分数和元素列表
  • 时间复杂度 O ( l o g ( N ) ∗ M ) O(log(N) * M) O(log(N)M)

10.BZPOPMIN

  • 功能ZPOPMIN的阻塞版本
  • 语法BZPOPMIN key [key ...] timeout
  • 返回值:元素列表
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

11.ZRANK

  • 功能:返回指定元素的排名,升序
  • 语法ZRANK key member
  • 返回值:排名
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

12.ZREVRANK

  • 功能:返回指定元素的排名,降序
  • 语法ZREVRANK key member
  • 返回值:排名
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

13.ZSCORE

  • 功能:返回指定元素的分数
  • 语法ZSCORE key member
  • 返回值:分数
  • 时间复杂度 O ( 1 ) O(1) O(1)

14.ZREM

  • 功能:删除指定元素
  • 语法ZREM key member [member ...]
  • 返回值:本次操作删除的元素个数
  • 时间复杂度 O ( l o g ( N ) ∗ M ) O(log(N) * M) O(log(N)M)

15.ZREMRANGEBYRANK

  • 功能:按照排序,升序删除指定范围的元素,左闭右闭
  • 语法ZREMRANGEBYRANK key start stop
  • 返回值:本次操作删除的元素个数
  • 时间复杂度 O ( l o g ( N ) + M ) O(log(N) + M) O(log(N)+M)

16.ZREMRANGEBYSCORE

  • 功能:按照分数删除指定范围的元素,左闭右闭
  • 语法ZREMRANGEBYSCORE key min max
  • 返回值:本次操作删除的元素个数
  • 时间复杂度 O ( l o g ( N ) + M ) O(log(N) + M) O(log(N)+M)

17.ZINCRBY

  • 功能:为指定的元素的关联分数添加指定的分数值
  • 语法ZINCRBY key increment member
  • 返回值:增加后元素的分数
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

2.集合间操作

1.有序集合的交集操作

请添加图片描述


2.ZINTERSTORE

  • 功能:求出给定有序集合中元素的交集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元 素对应的分数按照不同的聚合⽅式和权重得到新的分数
  • 语法ZINTERSTORE dest numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE]
    • 注意numkeys必须准确填写,以便后面将参数准确解析
  • 返回值:⽬标集合中的元素个数
  • 时间复杂度 O ( N ∗ K ) + O ( M ∗ l o g ( M ) ) O(N*K)+O(M*log(M)) O(NK)+O(Mlog(M)),N是输⼊的有序集合中最⼩的有序集合的元素个数,K是输⼊了 ⼏个有序集合,M是最终结果的有序集合的元素个数

3.有序集合的并集操作

请添加图片描述


4.ZUNIONSTORE

  • 功能:求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元 素对应的分数按照不同的聚合⽅式和权重得到新的分数
  • 语法ZUNIONSTORE dest numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE ]
  • 返回值:目标集合中的元素个数
  • 时间复杂度 O ( N ) + O ( M ∗ l o g ( M ) ) O(N)+O(M*log(M)) O(N)+O(Mlog(M)),N是输⼊的有序集合总的元素个数,M是最终结果的有序集合的元素个数

3.内部编码

1.ziplist(压缩链表)

  • 当有序集合的元素个数⼩于zset-max-ziplist-entries配置(默认128个), 同时每个元素的值都⼩于zset-max-ziplist-value配置(默认64字节)时,Redis会⽤ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使⽤

2.skiplist(跳表)

  • ziplist条件不满⾜时,有序集合会使⽤skiplist作为内部实现,因为此时ziplist的操作效率会下降

4.使用场景

  • 有序集合⽐较典型的使⽤场景就是排⾏榜系统
    • 例如:常⻅的⽹站上的热榜信息,榜单的维度可能是多⽅⾯的:按照时间、按照阅读量、按照点赞量
  • 示例:凭借点赞数,维护每天的热榜
    • 添加用户点赞数
      # ⽤⼾james发布了⼀篇⽂章,并获得3个赞,可以使⽤有序集合的zadd和zincrby功能
      zadd user:ranking:2024-09-01 3 james# 之后如果再获得赞,可以使⽤zincrby
      zincrby user:ranking:2022-03-15 1 james
      
    • 取消用户点赞数
      # 由于各种原因需要将⽤⼾删除,此时需要将⽤⼾从榜单中删除掉,可以使⽤zrem
      zrem user:ranking:2024-09-01 tom
      
    • 展示获取赞数最多的10个用户
      zrevrangebyrank user:ranking:2024-09-01 0 9
      
    • 展示用户信息以及用户分数:次功能将⽤⼾名作为键后缀,将⽤⼾信息保存在哈希类型中,⾄于⽤⼾的分数和排名可以使⽤zscorezrank来实现
      hgetall user:info:tom
      zscore user:ranking:2022-03-15 mike
      zrank user:ranking:2022-03-15 mike
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/434559.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H5响应式的文化传媒娱乐公司HTML网站模板源码

源码名称:响应式的文化传媒娱乐公司HTML网站模板源码 源码介绍:一款自适应H5文化传媒娱乐公司官网源码,源码带有6个H5页面,可用于文化传媒和娱乐公司官网。 需求环境:H5 下载地址: https://www.51888w.c…

Netty系列-5 Netty启动流程

背景 Netty程序有固定的模板格式,以ServerBootstrap为例: public class NettyServer {public void start(int port) {ServerBootstrap serverBootstrap new ServerBootstrap();EventLoopGroup boosGroup new NioEventLoopGroup(1);EventLoopGroup workGroup ne…

Kubernetes配置管理(kubernetes)

实验环境: 在所有节点上拉取镜像;然后把资源清单拉取到第一个master节点上; 同步会话,导入镜像: configmap/secret 配置文件的映射 变量: 基于valuefrom的方式 cm--》pod 特点:变量的名称可…

[JavaEE] IP协议

目录 一、 IP协议 1.1 基本概念 1.2 协议头格式 1.3 特殊IP 二、 地址管理 2.1 网段划分 2.2 CIDR(Classless Interdomain Routing) 2.3 私有IP地址和公网IP地址 2.4 NAT(Network Address Translation)-网络地址转换 2.5 路由选择 三、数据链路层 3.1 认识以太网 3…

什么是AQS

目录 AQS 介绍 原理 以可重入的互斥锁 ReentrantLock 为例 以倒计时器 CountDownLatch 以例 AQS 资源共享方式 实现自定义同步器 示例 性能优化 AQS 介绍 AQS (AbstractQueuedSynchronizer ),抽象队列同步器。AQS 是一个功能强大且…

cmd命令大全详解

CMD是Windows操作系统中的命令行解释器,它允许用户通过键入命令来执行各种操作。以下是一些常用的CMD命令及其简要说明: dir - 显示目录中的文件和子目录。 cmddir cd - 更改当前目录。 cmdcd [目录路径] mkdir - 创建新目录。 cmdmkdir [目录名] rmd…

Vue.js 与 Flask/Django 后端配合开发实战

Vue.js 与 Flask/Django 后端配合开发实战 在现代的 Web 开发中,前后端分离已成为一种主流架构,其中前端使用 Vue.js 等流行的框架,后端采用 Flask 或 Django 提供 API 接口。在这种开发模式下,前端负责页面的交互和动态效果&…

将Mixamo的模型和动画导入UE5

首先进入Mixamo的官网 , 点击 Character 选择一个模型 (当然你也可以自己上传模型/绑定动画) 然后点击下载 , 这个作为带骨骼的模型 选择FBX格式 , T Pose 直接下载 点击 Animations 选择动画 , 搜索 idle 默认站立动画 点击下载 , 格式选择 FBX , 不带模型只要骨骼 , 帧数选6…

前端面试经验总结2(经典问题篇)

谈谈你对前端的理解 前端主要负责产品页面部分的实现,是最贴近于用户的程序员。 基本工作要求: 1.参与项目,通过与团队成员,UI设计,产品经理的沟通,快速高质量的实现效果图,并能够精确到1px 2.做…

大模型培训讲师叶梓:Llama Factory 微调模型实战分享提纲

LLaMA-Factory ——一个高效、易用的大模型训练与微调平台。它支持多种预训练模型,并且提供了丰富的训练算法,包括增量预训练、多模态指令监督微调、奖励模型训练等。 LLaMA-Factory的优势在于其简单易用的界面和强大的功能。用户可以在不编写任何代码的…

TypeScript介绍和安装

TypeScript介绍 TypeScript是由微软开发的一种编程语言,它在JavaScript的基础上增加了静态类型检查。静态类型允许开发者在编写代码时指定变量和函数的类型,这样可以在编译时捕获潜在的错误,而不是等到运行时才发现问题。比如,你…

论文笔记:iCaRL: Incremental Classifier and Representation Learning

1. Contribution 提出了一种新的训练策略,iCaRL:允许以增量方式学习:只需要同时存在一小部分类别的训练数据,新类别可以逐步添加。同时学习分类器和数据表示:iCaRL能够同时学习强大的分类器和数据表示,这与…

[SAP ABAP] SELECTION-SCREEN

SELECTION-SCREEN用来调节系统生成的画面 REPORT z437_test_2024.TABLES: mara, zdbt_sch_437.SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. " Title1 PARAMETERS:p_1 DEFAULT A,p_2 TYPE char10. SELECTION-SCREEN END OF BLOCK b1.SELECTION-SCREEN …

实现微信小程序中点击单词显示在input的交互功能指南

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

基于SSH的酒店管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSH的酒店管理系统拥有三种角色 管理员:用户管理、房间分类管理、房间信息管理、开房管理、退房管理、开房和预订记录查询等 前台:房间分类管理、房间信息管…

【Go】-Websocket的使用

目录 为什么需要websocket 使用场景 在线教育 视频弹幕 Web端即时通信方式 什么是web端即时通讯技术? 轮询 长轮询 长连接 SSE websocket 通信方式总结 Websocket介绍 协议升级 连接确认 数据帧 socket和websocket 常见状态码 gorilla/websocket实…

LaTex符号不好记忆?

总结在Matlab中常用的LaTeX符号如下: 1. **希腊字母**: - \alpha 表示 α - \beta 表示 β - \gamma 表示 γ - \delta 表示 δ - \epsilon 表示 ε - \zeta 表示 ζ - \eta 表示 η - \theta 表示 θ - \iota 表示 ι -…

1-仙灵之谜(区块链游戏详情介绍)

1-仙灵之谜(区块链游戏详情介绍) 前言(该游戏仅供娱乐)正文 前言(该游戏仅供娱乐) 依稀记得本科那会儿参加了一个区块链实验室,那时每周末大家都会爬山或者抽出一下午讨论区块链以及未来&#x…

全国省、市、县(区)土地利用类型及面积面板数据(2019-2022年)

土地利用类型是根据土地利用方式和地域差异对土地资源单元进行划分的基本土地地域单元。 2019年-2022年全国省、市、县(区)土地利用类型及面积面板数据_土地利用类型数据下载资源-CSDN文库https://download.csdn.net/download/2401_84585615/89466102 …

9.28每日作业

1> 创建一个新项目,将默认提供的程序都注释上意义 01Demo.pro QT core gui # QT表示要引入的类库 core:核心库例如IO操作在该库中 gui:图形化界面库 # 如果要使用其他类库中的相关函数,则需要加对于的类库后&#…