Redis - Zset 有序集合

news2025/1/9 1:22:35

前言

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

        

        有序集合中的元素是不能重复的,但分数允许重复。类⽐于⼀次考试之后,每个人的学号不同,但分数可以相同

列表、集合、有序集合三者的异同点

命令

ZADD 添加或者更新指定的元素以及关联的分数

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

ZADD 的相关选项:

  • XX:仅仅⽤于更新已经存在的元素,不会添加新元素。(当元素不存在则没有效果)
  • NX:仅⽤于添加新元素,不会更新已经存在的元素。(当元素存在则没有效果)
  • CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会包含本次更新的元素的个数。
  • INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。

        在未添加选项的情况下,ZADD 返回的是本次添加成功的元素个数,当元素不存在就创建,存在就更新分数

语法

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

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

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

示例:

无选项:

XX:

NX:

CH:

INCR:

 

ZRANGE 返回指定区间里的元素(分数按照升序)

        带上 WITHSCORES 可以把分数也返回。分数按照升序,代表最小的数对应的下标为 0 

语法

ZRANGE key start stop [WITHSCORES]

此处是 [start, stop] 为下标构成的区间. 从 0 开始, ⽀持负数.

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

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

示例:

ZREVRANGE 返回指定区间里的元素(分数按照降序)

        带上 WITHSCORES 可以把分数也返回。分数按照降序,代表最大的数对应的下标为 0 

语法

ZREVRANGE key start stop [WITHSCORES]

此处是 [start, stop] 为下标构成的区间. 从 0 开始, ⽀持负数.

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

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

示例:

ZRANGEBYSCORE 返回在指定分数范围内的元素

语法

ZRANGEBYSCORE key min max [WITHSCORES]

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

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

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

示例:

无 (

有 (

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

语法

ZPOPMAX key [count]

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

返回值:分数和元素列表

示例:

BZPOPMAX 是 ZPOPMAX 的阻塞版本

语法

BZPOPMAX key [key ...] timeout

        timeout 代表阻塞的最长时间,单位为 秒,可以输入多个 key ,表示监控多个有序队列,当某个有序队列有元素就可以获取

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

返回值:元素列表

示例:

        当监控的有序队列都没有元素时,那么该命令就会进入阻塞,直到有序队列中添加了元素或达到了最大阻塞时间,才能结束命令

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

语法

ZPOPMIN key [count]

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

返回值:分数和元素列表

示例:

BZPOPMIN 是 ZPOPMIN 的阻塞版本

语法

BZPOPMIN key [key ...] timeout

         timeout 代表阻塞的最长时间,单位为 秒,可以输入多个 key ,表示监控多个有序队列,当某个有序队列有元素就可以获取

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

元素范围左闭右闭 [ start,stop ]

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

返回值:本次操作删除的元素个数

ZREMRANGEBYSCORE 按照分数删除指定范围的元素(升序)

语法

ZREMRANGEBYSCORE key min max

元素范围左闭右闭 [ start,stop ]

时间复杂度: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 是最终结果的有序集合的元素个数.

        返回值:⽬标集合中的元素个数

  • numkeys 是整数,描述了后面有多少个集合参与交集运算(之所以要说明集合个数,是为了避免与后面的选项产生歧义,知道个数以后,就能判断哪里是集合,哪里是选项)(类似粘包问题)
  • WEIGHTS 是权重,有序集合带有分数,此处指定的权重,相对于一个系数,会在求交集时,乘以当前的分数
  • AGGREGATE 表示求交集时,元素的分数按什么方式选择 (因为不同的集合中,相同的元素都有自己的分数),SUM 表示求和,MIN 表示取最小值,MAX 表示取最大值

例子

不带选项

        默认不带选项的情况下,分数是相同元素的分数之和

带 WEIGHTS 权重选项

        元素的分数会先乘以权重,再求和

带 AGGREGATE 选项

SUM 选项

        和默认情况一样,元素的分数就是各个集合中对应元素的分数之和

MIN 选项

        元素的分数就是各个集合中对应元素分数的最小值

MAX 选项

        

        元素的分数就是各个集合中对应元素分数的最大值

ZUNIONSTORE 求出有序集合中元素的并集并保存进目标有序集合中

        求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。

语法

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] 
[AGGREGATE <SUM | MIN | MAX>]

        ZUNIONSTORE 和 ZINTERSTORE 的选项含义完全一样,只是一个求并集,一个求交集,推荐看上面的 ZINTERSTORE 作为参考

内部编码

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

  • ziplist(压缩列表):当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个), 同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使⽤。
  • skiplist(跳表):当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,因为此时 ziplist 的操作效率会下降。

        通过 object encoding 可以查看内部编码

使用场景

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

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

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

相关文章

笔记13-OSError: [Errno 24] Too many open files

文章目录 参考文献失败尝试系列查看发现&#xff0c;似乎是因为线程数有限制 修改配置先查查看 增加文件数限制&#xff0c;然后使用命令运行&#xff08;成功&#xff09; 参考文献 Linux 最大可以打开多少文件描述符&#xff1f; OSError: [Errno 24] Too many open files错…

Redis-单机安装

试图从官网注册不了我也不知道什么情况。 网盘自取吧&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1KERBQaH9gCT10AGt9z0_jg?pwdyjen 安装比较简单&#xff0c;照着敲就完了每一步都试过了&#xff0c;先单机安装&#xff0c;后面搭建集群。 1.将安装包放到/usr/…

一文带你了解MySQL的索引分类

文章目录 ☃️分类☃️演示图☃️思考☃️总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开…

C++之set/map相关实现

看着上面的图片&#xff0c;你可能对set和map的多样变化产生疑惑&#xff0c;下面我们就来详细讲解他们的区别以及实现 一.set/map 首先&#xff0c;在这里我们要声明&#xff0c;如果你对二叉搜索树一点都不了解的话&#xff0c;建议你先去将搜索二叉树学会再来学习这里的内…

MFC 列表控件删除实例(源码下载)

1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例&#xff08;源码下载) 》 2、程序功能选中列表控件某一项&#xff0c;删除按钮由禁止变为可用&#xff0c;点击删除按钮&#xff0c;选中的项将删除。 3、首先在主界面添加一个删除参数按钮。 4、在myDlg.cpp 文件…

Python语言零基础入门——文件

目录 一、文件的基本概念 1.文件 2.绝对路径与相对路径 3.打开文件的模式 二、文件的读取 三、文件的追加 四、文件的写入 五、with语句 六、csv文件 1.csv文件的读取 2.csv文件的写入 七、练习题&#xff1a;实现日记本 一、文件的基本概念 1.文件 文件是以计算…

win10禁止自动更新的终极方法

添加注册表值 1.运行&#xff0c;输入regedit 2.打开注册表编辑器依次进入以下路径“计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings”。 3.在Settings项中&#xff0c;新建DWORD&#xff08;32位&#xff09;值(D)&#xff0c;重命名为以下命名“Fl…

python判断大图中包含小图并输出位置总结

python判断大图中包含小图并输出位置总结 没啥可说的&#xff0c;项目遇到了就直接上代码&#xff0c;可以减轻劳动力&#xff0c;花最少得时间实现应用功能。 import cv2 # 读取大图片和小图片的路径 img_big cv2.imread(big_image.png) img_small cv2.imread(small_image…

使用protoc-jar-maven-plugin生成grpc项目

在《使用protobuf-maven-plugin生成grpc项目》中我们使用protobuf-maven-plugin完成了grpc代码的翻译。本文我们将只是替换pom.xml中的部分内容&#xff0c;使用protoc-jar-maven-plugin来完成相同的功能。总体来说protoc-jar-maven-plugin方案更加简便。 环境 见《使用proto…

数据结构--顺序表经典OJ题

例1&#xff1a;合并有序顺序表 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff…

R可视化:分组频率分布直方图和密度图

介绍 ggplot2绘制分组频率分布直方图和密度图 加载R包 knitr::opts_chunk$set(message FALSE, warning FALSE) library(tidyverse) library(patchwork) library(ggpubr) library(rstatix)# rm(list ls()) options(stringsAsFactors F) options(future.globals.maxSize …

数据结构与算法---树

数据结构可视化网址 Structure Visualization: https://www.cs.usfca.edu/~galles/visualization/Totuma: https://www.totuma.cn/Algorithm Visualizer: https://algorithm-visualizer.org/ 构建二叉树 // C#include<stdio.h> #include<stdlib.h>typedef char T…

电脑找不到msvcp140.dll如何修复?msvcp140.dll丢失的多种解决方法分享

在日常电脑操作过程中&#xff0c;用户可能会遇到一个令人困扰的问题&#xff0c;即屏幕上突然弹出一条错误提示&#xff1a;“由于找不到msvcp140.dll&#xff0c;无法继续执行代码”。这一情况往往导致应用程序无法正常启动或运行&#xff0c;给工作和娱乐带来不便。不过&…

freertos入门---创建FreeRTOS工程

freertos入门—创建FreeRTOS工程 1 STM32CubeMx配置 双击运行STM32CubeMX,在首页选择“ACCESS TO MCU SELECTOR”,如下图所示&#xff1a;   在MCU选型界面&#xff0c;输入自己想要开发的芯片型号&#xff0c;如&#xff1a;STM32F103C8T6: 2 配置时钟 在“System Core”…

【MATLAB】解决不同版本MATLAB出现中文乱码的问题

解决不同版本MATLAB出现中文乱码的问题 方法1&#xff1a;更改保存类型为GBK方法2&#xff1a;记事本打开方法3&#xff1a;Notepad参考 低版本matlab打开高版本Matlab的.m文件时&#xff0c;出现中文乱码问题。比如下图&#xff1a; 出现原因为&#xff1a; 编码格式不统一问…

【深度学习】第二门课 改善深层神经网络 Week 1 深度学习的实践层面

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;深度学习 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对…

力扣---二叉树的锯齿形层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,…

通信光缆主要敷设方式有哪些(续)

在《通信光缆主要敷设方式有哪些》一文中&#xff0c;介绍了光缆的直埋、架空和管道敷设方式。此外&#xff0c;根据敷设场景的不同&#xff0c;光缆的常见敷设方式还包括&#xff1a;高铁槽道内敷设、水底敷设、墙壁敷设、引上、室内敷设等。 1 高铁槽道内光缆敷设 光缆顺沿高…

机器学习每周挑战——二手车车辆信息交易售价数据

这是数据集的截图 目录 背景描述 数据说明 车型对照&#xff1a; 燃料类型对照&#xff1a; 老规矩&#xff0c;第一步先导入用到的库 第二步&#xff0c;读入数据&#xff1a; 第三步&#xff0c;数据预处理 第四步&#xff1a;对数据的分析 第五步&#xff1a;模型建…

会声会影电影片头怎么做 会声会影电影质感调色技巧

片头通常通过一系列的图像、音乐和文字等元素来引入电影的主题和氛围。通过视觉和音频的呈现方式&#xff0c;给观众留下深刻的第一印象&#xff0c;为电影的故事铺设基础。这篇文章来学习一下会声会影片头怎么做&#xff0c;会声会影电影质感调色技巧。 一、会声会影电影片头…