Redis 7.x 系列【10】数据类型之有序集合(ZSet)

有道无术,术尚可求,有术无道,止于术。

本系列Redis 版本 7.2.5

源码地址:https://gitee.com/pearl-organization/study-redis-demo

文章目录

    • 1. 概述
    • 2. 常用命令
      • 2.1 ZADD
      • 2.2 ZCARD
      • 2.3 ZSCORE
      • 2.4 ZRANGE
      • 2.5 ZREVRANGE
      • 2.6 ZRANK
      • 2.7 ZREM
      • 2.8 ZPOPMIN
      • 2.9 ZPOPMAX
      • 2.10 ZINCRBY
      • 2.11 集合运算
    • 3. 应用场景

1. 概述

ZSet 是一种有序集合类型,可以存储不重复的元素,并且给每个元素赋予一个 double 类型的排序权重值(score)。

2. 常用命令

ZSet 相关所有命令:

命名描述
BZMPOP按照指定的排序方式推出多个队列中指定数量的元素
BZPОPMAXZPOPMAX 的阻塞版本,作用相同,只是在目标集合中没有元素时会阻塞,timeout 参数指定了过期时间 (0 表示永不超时)
BZPOPMINZPOPMAX 一样,只是返回 score 最小的
ZADD向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZCARD获取有序集合的成员数
ZCOUNT计算在有序集合中指定区间分数的成员数
ZDIFF返回集合之间的差集
ZDIFFSTORE返回集合之间的差集,并将结果存储在另一个新的有序集合中
ZINCRBY有序集合中对指定成员的分数加上增量 increment
ZINTER用于计算多个有序集合的交集
ZINTERCARD用于计算多个有序集合的交集,并返回成员个数
ZINTERSTORE计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key
ZLEXCOUNT计算有序集合中指定区间内成员的数量
ZMPOP弹出一个或多个成员
ZMSCORE从有序集合中获取多个成员的分数(score
ZPOPMAX用于删除并返回集合中分数(score)最高的一个或多个元素。如果集合为空,则命令不执行任何操作
ZPOPMIN用于删除并返回集合中分数(score)最低的一个或多个元素。如果集合为空,则命令不执行任何操作
ZRANDMEMBER随机获取一个或多个元素
ZRANGE获取指定范围内的成员
ZRANGEBYLEX根据成员名称的字典顺序来返回有序集合中指定区间的成员。注意是基于成员名称的字典顺序,而不是分数(score)的大小
ZRANGEBYSCORE返回有序集中指定分数区间内的成员,分数从高到低排序
ZRANGESTORE绍 返回集合中指定排名范围内的成员,并将结果存储到指定key
ZRANK返回有序集合中指定成员的索引
ZREM移除有序集合中的一个或多个成员
ZREMRANGEBYLEX移除有序集合中给定的字典区间的所有成员
ZREMRANGEBYRANK移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYSCORE移除有序集合中给定的分数区间的所有成员
ZREVRANGE返回有序集中指定区间内的成员,通过索引,分数从高到底
ZREVRANGEBYLEX根据字典范围返回成员,返回的成员顺序是反向的,即从高到低的字典顺序
ZREVRANGEBYSCORE返回指定分数范围内的成员,并按照分数从高到低进行排序
ZREVRANK返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
ZSCAN迭代有序集合中的元素(包括元素成员和元素分值)
ZSCORE返回有序集中,成员的分数值
ZUNION计算一个或多个有序集的并集
ZUNIONSTORE计算一个或多个有序集的并集,并存储在新的 key

2.1 ZADD

ZADD 命令用于将一个或多个元素及其 score 值加入到有序集 key 中。

注意事项:

  • 如果某个 member 已经是有序集的成员,那么更新这个 memberscore 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
  • 如果有序集合 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
  • key 存在但不是有序集类型时,返回一个错误。
  • score 值可以是整数值或双精度浮点数,score 可为正也可以为负。
  • 获取一个成员当前的分数可以使用 ZSCORE 命令,也可以用它来验证成员是否存在。

基本语法:

ZADD key [NX|XX] [CH] [INCR] score member [score member …]

添加单个元素:

redis> ZADD page_rank 10 google.com
(integer) 1

添加多个元素:

redis> ZADD page_rank 9 baidu.com 8 redis.com.cn
(integer) 2redis> ZRANGE page_rank 0 -1 WITHSCORES
1) "redis.com.cn"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"

添加已存在元素,且 score 值不变:

redis> ZADD page_rank 10 google.com
(integer) 0redis> ZRANGE page_rank 0 -1 WITHSCORES  # 没有改变
1) "redis.com.cn"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"

添加已存在元素,但是改变 score 值:

redis> ZADD page_rank 6 redis.com.cn
(integer) 0redis> ZRANGE page_rank 0 -1 WITHSCORES  # redis.com.cn 元素的 score 值被改变
1) "redis.com.cn"
2) "6"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"

ZADD 命令支持参数,参数位于 key 名字和第一个 score 参数之间(GTLTNX 三者互斥不能同时使用):

  • XX: 仅更新存在的成员,不添加新成员。
  • NX:不更新存在的成员,只添加新成员。
  • LT: 更新新的分值比当前分值小的成员,不存在则新增。
  • GT: 更新新的分值比当前分值大的成员,不存在则新增。
  • CH:返回变更成员的数量。变更的成员是指新增成员 和 score 值更新的成员,命令指明的和之前 score 值相同的成员不计在内。 在通常情况下,`ZADD 返回值只计算新添加成员的数量。
  • INCRZADD 使用该参数与 ZINCRBY 功能一样。一次只能操作一个 score-element 对。

Redis 有序集合的分数使用双精度 64 位浮点数表示。在 Redis 所支持的平台上,称为 IEEE 754 floating point number,它能包括的整数范围是-(2^53) +(2^53)。或者说是-90071992547409929007199254740992。更大的整数在内部用指数形式表示,所以,如果为分数设置一个非常大的整数,你得到的是一个近似的十进制数。

有序集合按照分数以递增的方式进行排序。相同的成员(member)只存在一次,有序集合不允许存在重复的成员。 分数可以通过 ZADD 命令进行更新或者也可以通过 ZINCRBY 命令递增来修改之前的值,相应的他们的排序位置也会随着分数变化而改变。

有序集合里面的成员是不能重复的都是唯一的,但是,不同成员间有可能有相同的分数。当多个成员有相同的分数时,他们将是按字典排序(ordered lexicographically)(仍由分数作为第一排序条件,然后,相同分数的成员按照字典序排序)。

字典顺序排序用的是二进制,它比较的是字符串的字节数组。如果用户将所有元素设置相同分数(例如 0 ),有序集合里面的所有元素将按照字典顺序进行排序,范围查询元素可以使用 ZRANGEBYLEX 命令(注:范围查询分数可以使用ZRANGEBYSCORE 命令)。

2.2 ZCARD

ZCARD 命令用于返回有序集的成员个数,当 key 不存在时,返回 0 。

基本语法:

ZCARD key 

示例:

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZCARD myzset
(integer) 2

2.3 ZSCORE

ZSCORE 命令用于返回有序集 key.中成员 member 的分数,返回值为字符串格式的双精度浮点数。如果有不存在的 member ,或者 key 不存在,返回 nil

基本语法:

ZSCORE key member

示例:

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZSCORE myzset "one"
"1"

2.4 ZRANGE

ZRANGE 命令返回有序集中指定区间内的成员,其中成员的按分数值递增(从小到大)来排序,具有相同分数值的成员按字典序排列。

注意事项:

  • 如果你需要成员按值递减来排列,请使用 ZREVRANGE命令。
  • 下标参数 startstop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
  • 也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
  • startstop 都是包含在内的区间,因此例如 ZRANGE myzset 0 1 将会返回有序集合的第一个和第二个元素。
  • 超出范围的索引不会产生错误。 如果 start 参数的值大于有序集合中的最大索引,或者 start > stop ,将会返回一个空列表。 如果 stop 的值大于有序集合的末尾,会将其视为有序集合的最后一个元素。
  • 可以传递 WITHSCORES 选项,以便将元素的分数与元素一起返回。这样返回的列表将包含 value1,score1,...,valueN,scoreN ,而不是 value1,...,valueN 。 客户端类库可以自由地返回更合适的数据类型(建议:具有值和得分的数组或元组)。

基本语法:

ZRANGE key start stop [WITHSCORES]

简单示例:

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
redis> ZRANGE myzset 2 3
1) "three"
redis> ZRANGE myzset -2 -1
1) "two"
2) "three"

WITHSCORES 示例:

redis> ZRANGE myzset 0 1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"

2.5 ZREVRANGE

ZREVRANGE 命令返回有序集中,指定区间内的成员。其中成员的位置按 score 值递减(从高到低)来排列。除了成员排序相反外,其他方面和 ZRANGE 命令一样。

基本语法:

ZREVRANGE key start stop [WITHSCORES]

示例:

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREVRANGE myzset 0 -1
1) "three"
2) "two"
3) "one"
redis> ZREVRANGE myzset 2 3
1) "one"
redis> ZREVRANGE myzset -2 -1
1) "two"
2) "one"

2.6 ZRANK

ZRANK 命令返回有序集中成员的排名,其中有序集成员按 score 值从低到高排列。排名从 0 开始,也就是说,分值最低的成员排名为 0

基本语法:

ZRANK key member

示例:

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANK myzset "three"
(integer) 2
redis> ZRANK myzset "four"
(nil)

2.7 ZREM

ZREM 命令用于从有序集合中删除指定的成员,如果 member 不存在则被忽略。当 key 存在,但是不是有序集合类型时,返回类型错误。

基本语法:

ZREM key member [member ...]

示例:

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREM myzset "two"
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "three"
4) "3"

2.8 ZPOPMIN

ZPOPMIN 删除并返回最多 count 个有序集合 key 中最低得分的成员。返回值为删除的元素和分数列表。

注意事项:

  • 如未指定,count 的默认值为 1
  • 指定一个大于有序集合的候选总数的 count 不会产生错误。
  • 当返回多个元素时候,得分最低的元素将是第一个元素,然后是分数较高的元素。

基本语法:

ZPOPMIN key [count]

示例:

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZPOPMIN myzset
1) "one"
2) "1"

2.9 ZPOPMAX

ZPOPMAX 删除并返回最多 count 个有序集合 key 中的最高得分的成员。返回值为删除的元素和分数列表。

注意事项:

  • 如未指定,count 的默认值为 1
  • 指定一个大于有序集合的候选总数的 count 不会产生错误。
  • 当返回多个元素时候,得分最高的元素将是第一个元素,然后是分数较低的元素。

基本语法:

ZPOPMAX key [count]

示例:

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZPOPMAX myzset
1) "three"
2) "3"

2.10 ZINCRBY

ZINCRBY 为有序集 key 的成员 memberscore 值加上增量 increment 。返回值为以字符串形式表示的成员的新 score 值(双精度浮点数)。

注意事项:

  • key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member
  • key 不是有序集类型时,返回"ERR WRONGTYPE Operation against a key holding the wrong kind of value"
  • score 值可以是字符串形式表示的整数值或双精度浮点数。
  • 可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -2 member ,就是让 memberscore 值减去 2

基本语法:

ZINCRBY key increment member

示例:

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZINCRBY myzset 2 "one"
"3"
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "one"
4) "3"

2.11 集合运算

Set 一样,也支持集合运算:

    • ZINTER
    • ZINTERCARD
    • ZINTERSTORE
    • ZUNION
    • ZUNIONSTORE
    • ZDIFF
    • ZDIFFSTORE

3. 应用场景

ZSetSet 的基础上增加了分值排序,常用于排行榜场景,比如热搜、成绩排名等。
在这里插入图片描述

例如,添加搜索消息,并初始化访问值为 1

localhost:0>ZADD msg_rank 1 msg_1
"1"
localhost:0>ZADD msg_rank 1 msg_2
"1"
localhost:0>ZADD msg_rank 1 msg_3
"1"

用户点击消息时,增加访问次数:

"1"
localhost:0>ZINCRBY msg_rank 1 msg_2
"1"
localhost:0>ZINCRBY msg_rank 1 msg_3
"2"
localhost:0>ZINCRBY msg_rank 1 msg_3
"3"

显示热搜前十排行榜:

localhost:0>ZREVRANGE msg_rank 0 9 WITHSCORES1)  "msg_3"2)  "3"3)  "msg_2"4)  "1"5)  "msg_1"6)  "1"

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

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

相关文章

kettle使用手册 安装9.0版本 建议设置为英语

0.新建转换的常用组件 0. Generate rows 定义一个字符串 name value就是字符串的值 0.1 String operations 字段转大写 去空格 1. Json input 来源于一个json文件 1.json 或mq接收到的data内容是json字符串 2. Json output 定义Jsonbloc值为 data, 左侧Fieldname是数据库…

常见的字符串函数(包含头文件string.h)和字符函数(2)

八. strstr函数 1.strstr的定义 char *strstr( const char *str1, const char *str2 ); ->1. strstr查找子串(str2)在字符串(str2)中第一次出现的位置,记录并返回该位置的指针,如果找不到,则返回NULL ->2. str1:查找字符…

springboot + Vue前后端项目(第二十记)

项目实战第二十记 写在前面1. 高德地图官网2. 开发文档3. 集成高德地图3.1 在public文件夹下创建config.js3.2 index.html(在项目启动文件中引入外部的js)3.3 点标记(用点标记当前位置)3.4 信息窗体(点击当前位置&…

【MAVEN学习 | 第2篇】Maven工程创建及核心功能

文章目录 一. 基于IDEA的Maven工程创建1.1 Maven工程GAVP属性(1)GroupID 格式(2)ArtifactID 格式(3)Version版本号格式(4)Packaging定义规则 1.2 IDEA构建Maven JavaSE工程1.3 IDEA构…

Termius:现代化的SSH客户端,让服务器管理变得优雅简洁

Termius简介 是一款现代化的跨平台终端模拟器和SSH客户端。以下是对Terminus的介绍以及使用它的理由: 跨平台兼容性: Terminus支持Windows、macOS、Linux、IOS和Android,让用户在不同操作系统间保持一致的终端体验。优雅的用户界面&#xf…

通达信机构买卖抓牛指标公式源码

通达信机构买卖抓牛指标公式源码&#xff1a; X_1:V/CLOSE/2; X_2:SUM(IF(X_1>100 AND CLOSE>REF(CLOSE,1),X_1,0),0); X_3:SUM(IF(X_1>100 AND CLOSE<REF(CLOSE,1),X_1,0),0); X_4:SUM(IF(X_1<100 AND CLOSE>REF(CLOSE,1),X_1,0),0); X_5:SUM(IF(X_1&l…

ATA-7025:高压放大器的原理是怎样的

高压放大器是一种电子器件&#xff0c;主要用于将输入信号的电压放大到更高的水平。它在许多领域中都有重要的应用&#xff0c;包括医学影像设备、科学研究装置、激光系统等。高压放大器的原理涉及到放大器的工作原理、电路结构、工作特性等多个方面。下面将从这些方面对高压放…

.net core接入nacos注册服务并使用配置中心

1、安装依赖 Nuget包&#xff1a;nacos-sdk-csharp.Extensions.Configuration和nacos-sdk-csharp.AspNetCore 2、在appsettings.json中配置 "nacos": {"ServerAddresses": ["http://localhost:8848/"],"DefaultTimeOut": 15000,"…

各省药品集中采购平台-地方药品集采分析数据库

国家第十批药品集中采购的启动时间暂未明确&#xff0c;但即将到来&#xff0c;在5月&#xff0c;国家医保局发布了《关于加强区域协同做好2024年医药集中采购提质扩面的通知》&#xff0c;其中明确指出将“开展新批次国家组织药品和医用耗材集中带量采购&#xff0c;对协议期满…

Vue2 - 项目上线后生产环境中去除console.log的输出以及断点的解决方案

前言 当你准备将Vue.js应用程序部署到生产环境时,一个关键的优化步骤是移除代码中的所有 console.log 语句以及断点。在开发阶段,console.log 是一个非常有用的调试工具,但在生产环境中保留它们可能会影响性能和安全性。在本文中,我将向你展示如何通过使用Vue CLI 2来自动…

大语言模型在医疗领域的进展、应用和挑战_医疗大语言模型算法csdn

### 概述 本文综述了医学领域大型语言模型&#xff08;LLM&#xff09;的进展、应用和面临的挑战。大型语言模型如ChatGPT在理解和生成人类语言方面显示出了显著的能力&#xff0c;引起了广泛关注。在医学领域&#xff0c;研究人员正致力于利用LLM支持各种医疗任务&#xff0c…

13 Redis-- MySQL 和 Redis 的数据一致性

Redis-- MySQL 和 Redis 的数据一致性 先抛一下结论&#xff1a;在满足实时性的条件下&#xff0c;不存在两者完全保存一致的方案&#xff0c;只有最终一致性方案。

FlinkX学习

FlinkX学习 FlinkX安装 由于flinkx已经改名chunjun 官网已不存在 (https://gitee.com/lugela/flinkx#flinkx)这里可以看到flinkx的操作文档 1、上传并解压 unzip flinkx-1.10.zip -d /usr/local/soft/2、配置环境变量 FLINKX_HOME/usr/local/soft/flinkx-1.10 export PATH$F…

STL-迭代器

1.迭代器 1.1正向迭代器 正向迭代器是用一个类封装的&#xff0c;迭代器类。例如&#xff1a;在vector&#xff0c;string中的迭代器就相当于一个指针&#xff0c;在list类中用一个类来封装一个节点&#xff0c;实质上也还是一个指针&#xff0c;迭代器就相当于指向一个节点的…

背靠广汽、小马智行,如祺出行打得过滴滴和百度吗?

©自象限原创 作者丨艾AA 编辑丨薛黎 北京时间6月14日凌晨&#xff0c;在特斯拉股东大会上&#xff0c;马斯克阐述了对Robotaxi&#xff08;自动驾驶出租车&#xff09;商业模式的构想——特斯拉不仅会运营自己的无人驾驶出租车车队&#xff0c;还可以让特斯拉车主们的爱…

微服务开发 —— 项目环境搭建篇

环境搭建 Linux 环境搭建 Linux 环境搭建大家可以使用虚拟机 VMware、VirtualBox 等应用创建虚拟机&#xff0c;使用Vagrant也可以快捷搭建虚拟环境&#xff1b;Windows 中有 WSL2&#xff0c;Windows 中的 Docker 也对 WSL 进行了支持&#xff0c;也是一个不错的选择。或者可…

Windows - 像Linux一样使用alias

前言 阅读本文约2分钟 说明 使用doskey命令 设置别名 查看当前目录 doskey lldir 激活conda的spider环境 doskey spiderconda activate spider 退出conda环境 doskey condaqconda deactivate 查看所有别名 doskey /macros

实现设计开挂|如何设计出坚不可摧的网球拍?

数字揭秘 我们发现自己可能偶尔会以过激的方式表达沮丧或愤怒&#xff0c;哪怕是在公共场合。就算是世界级的网球运动员也无法避免偶尔的情绪爆发&#xff0c;他们有时会砸球拍来释放被压抑的情绪或应对来自竞赛的压力。 网球运动员的情绪爆发已被证明是不可避免的。哪怕是包括…

Linux系统相关函数总结

在应用程序当中&#xff0c;有时往往需要去获取到一些系统相关的信息&#xff0c;譬如时间、日期、以及其它一些系统相关信息&#xff0c;本章将向大家介绍如何通过 Linux 系统调用或 C 库函数获取这些系统信息。除此之外&#xff0c;还会向大家介绍 Linux 系统下的/proc 虚拟文…

浏览器插件利器-allWebPluginV2.0.0.14-beta版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持谷歌、火狐等浏…