[Redis][Zset]详细讲解

news2024/11/17 16:32:02

目录

  • 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.coloradmin.cn/o/2167022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS-noetic自定义action文件进行通信

前言 本系统的系统是Ubuntu20.04的ros-noetic,本文讲述了通过创建 ROS 节点(服务器和客户端)的完整流程,使用 Action 实现从 1 到 N 的累加和,并在计算过程中向客户端发送进度反馈。 整体概述 创建功能包:…

多线程极速导出/9字段10W行只需2秒/导入导出打印组件/功能丰富简单易用

一、功能特点 组件同时集成了导出数据到csv、xls、pdf和打印数据。所有操作全部提供静态方法无需new,数据和属性等各种参数设置采用结构体数据,极为方便。同时支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等数据源。提供静态方法…

如何使用GitHub Desktop管理GitLab库

不管是新手还是老手,Github Desktop都是在苹果系统和Windows系统上管理与创建项目的不错的方式,GitHub Desktop都能够让在GitHub上的工作流更为简单快捷。 注意,以下步骤只支持原版的GitHub Desktop 第一步 从这下载GitHub Desktop打开你的G…

CSS中<a>超链接的样式

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!-- 伪类选择器 -->&…

大模型RAG入门到实战基础教程(非常详细),大模型RAG入门到精通,收藏这一篇就够了!

写在前面 大模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的浪潮已经席卷了几乎各行业&#xff0c;但当涉及到专业场景或行业细分域时&#xff0c;通用大模型就会面临专业知识不足的问题。相对于成本昂贵的“Post Train”或“SFT”&#xff0c;基于RAG的技…

css 中 ~ 符号的使用

直接看代码 <script setup> </script><template><div class"container"><p><a href"javascript:;">纪检委</a><a href"javascript:;">中介为</a><a href"javascript:;">…

Vxe UI vue 使用 vxe-form 表单实现简历模板

Vxe UI 使用 vxe-form 表单实现简历模板 查看 github <template><div><p>边框&#xff1a;<vxe-switch v-model"border"></vxe-switch>标题背景&#xff1a;<vxe-switch v-model"titleBackground"></vxe-switch&…

【GreenHills】使用“gsrec”命令生成二进制文件

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录在GHS中修改工程命令&#xff0c;输出hex&#xff0c;bin文件等&#xff0c;对问题进行快速答疑&#xff0c;GHS编译器如何去使用”gsrec“生成不同的二进制文件。 2、 问题场景 客户想要生成hex&#xff0c;bi…

【每日一题】LeetCode 2306.公司命名(位运算、数组、哈希表、字符串、枚举)

【每日一题】LeetCode 2306.公司命名&#xff08;位运算、数组、哈希表、字符串、枚举&#xff09; 题目描述 给定一个字符串数组 ideas&#xff0c;表示在公司命名过程中使用的名字列表。我们需要从 ideas 中选择两个不同的名字&#xff0c;称为 ideaA 和 ideaB。然后交换 i…

深入探索Go语言反射机制:reflect包的高级用法和实战技巧

深入探索Go语言反射机制:reflect包的高级用法和实战技巧 引言reflect包的作用和重要性为什么reflect包对于Go语言开发者的重要性 reflect包的基础reflect包的导入和基本用法reflect的核心概念&#xff1a;类型&#xff08;Type&#xff09;和值&#xff08;Value&#xff09;使…

数字化TPM:从概念到实践的飞跃之旅

数字化TPM&#xff0c;顾名思义&#xff0c;是将传统TPM理念与现代信息技术深度融合的产物。它不仅仅关注设备维护的“全面性”和“预防性”&#xff0c;更强调通过大数据、云计算、物联网等先进技术&#xff0c;实现设备状态的实时监控、故障预警、智能决策及优化管理。这一转…

MyBatis 深层次 Map 自动嵌套:解锁数据映射新境界

在 Java 开发的征程中&#xff0c;MyBatis 以其强大的数据库映射功能而备受青睐。其中&#xff0c;深层次 Map 自动嵌套这一特性更是为开发者带来了诸多惊喜与便利。 前提&#xff1a;首先开启自动映射&#xff01; java和mysql命名规则不一样&#xff0c;每次在mybatis中起别…

【成功案例】解决浙江xx电子有限公司的勒索病毒

01 背景 当地时间 2020年5月18日&#xff0c;思而听网络科技有限公司&#xff08;以下简称思而听&#xff09;接到浙江xx电子有限公司&#xff08;以下简称xx电子&#xff09;的求救邮件&#xff0c;邮件中指出&#xff0c;xx电子的内部计算机收到了不明黑客的恶意勒索病毒攻击…

MySQL_聚合函数

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

如何在算家云搭建text-generation-webui(文本生成)

一、text-generation-webui 简介 text-generation-webui 是一个流行的用于文本生成的 Gradio Web UI。支持 transformers、GPTQ、AWQ、EXL2、llama.cpp (GGUF)、Llama 模型。 它的特点如下&#xff0c; 3 种界面模式&#xff1a;default (two columns), notebook, chat支持多…

揭秘计算机内部奥秘:从CPU到操作系统,深入探索进程与线程的工作原理

&#x1f4c3;个人主页&#xff1a;island1314 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 引言 计算的需求在人类的历史中是广泛存在的&#xff0c;发展大体经历了从一般计…

视频融合共享平台LntonAIServer视频智能分析抖动检测算法和过亮过暗检测算法

LntonAIServer作为一款智能视频监控平台&#xff0c;集成了多种先进的视频质量诊断功能&#xff0c;其中包括抖动检测和过暗检测算法。这些算法对于提升视频监控系统的稳定性和图像质量具有重要意义。 以下是对抖动检测算法和过暗检测算法的应用场景及优势的详细介绍。 一、L…

电商必备的8个AI工具

让我们来谈谈电子商务的 AI 工具。 这篇文章旨在帮助你找到真正的 AI 电子商务软件&#xff0c;以协助你进行内容创建和管理、销售、客户服务自动化、营销策略审计、竞争情报等。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - …

云和恩墨携手华为,发布zCloud数据库备份管理一体机并宣布共建数据保护生态...

为期三天的第九届华为全联接大会&#xff08;HUAWEI CONNECT 2024&#xff09;于9月19日在上海世博中心&展览馆盛大召开。20日下午&#xff0c;一场围绕“全场景数据保护&#xff0c;护航数智化时代”的专题论坛举办&#xff0c;云和恩墨受邀参加&#xff0c;并期待与华为合…

神舟笔记本安装Control Center无法打开

神舟笔记本安装Control Center无法打开 1.1 下载驱动 首先来到神舟笔记本官方&#xff0c;下载笔记本对应的驱动&#xff1a;http://archive.hasee.com/Chinese/download/computer.aspx?cid105001003001001 选择型号搜索&#xff08;例如笔者的时Z8-CT7NT&#xff09;&#…