Redis中zSet类型的操作

news2024/11/25 13:00:37

一、什么是zSet
    zSet是一种特殊的set集合,它的值不能重复,但会对值进行排序。它有个score值,按照Score值从小到大进行排序。score称为分值,它的值是任意正浮点数。数值越小的排序越靠前。如果score相同,则按值的编码升序。

  默认情况下zSet使用listpack做为存储结构,当集合中的元素大于等于512个或是单个值的字节数大于等于64,存储结构会修改为skiplist。


二、zSet的使用场景

1、实时排行榜

    比如双11商品销售排行榜,可以使用分值记录数量,而值为商品id,分值越大的会越排在后面,然后使用方法把集合反转就可以获得销量最多的商品

2、实时竞拍

    可以用竞拍的金额做为分值,而值为竞拍人。同样反转后可以得到竞价最高的人

三、添加值
1、一次添加一个或多个值

    一次添加 一个或多个值,如果某个值已存在,则忽略此值,如果score已存在,则替换此score对应的值,最终返回实际添加和替换的值的数量。如果所有值都被忽略,则返回 0

语法

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

其中

NX为仅当值不存在时才添加

XX为仅当值存在时才替换

CH为返回当前语句中在添加前的集合中不存在的score值的数量,如集合中又有score值1和2 ,当添加的score值为 1、2、3、4时,因为3和4不存在,所以返回2 

INCR:当值不存在,则按score添加,如果值已存在,则原来的值score加上当前指定的值,添加成功后返回score的值。当使用incr参数时,一次只能添加一个值

score:分值,用于排序的编码

mumber:要添加的值

示例

//按顺序添加三个值,分别为a、b、c ,返回3
zadd key 0 a 1 b 2 c
//d不存,替换0,b存在,忽略,返回 1
zadd key nx 0 d 4 b
//两个score值都不存在,返回2
zadd key ch 4 e 5 b
//c存在,score值在原来的基础上加6,返回8
zadd key incr 6 c

2、增加分值的值

    此方法相当于zadd的incr参数,当值不存在,值的分值为指定的值,如果存在,则值的分值为原分值加上指定的值

语法

ZINCRBY key increment member

示例

//x不存在,它的score为2
zincrby key 2 x

//a存在,它的score原值为0,加上3后返回3
zincrby key 3 a

四、删除值
1、删除一个或多个指定的值,返回实际删除的值的数量

语法 

ZREM key member [member ...]

示例

//删除 x 和 b
ZREM key x b

2、删除同一分值中指定值区间内的所有值

    删除同一分值中指定值区间内的所有值,以值的编码为排序,编码小的为小值,编码大的为大值。与值在集合中的位置无关。返回删除的值的数量。

当值以“[”开头,表示结果中包含此值,当值以“(”开头,表示结果中不包含此值

语法

ZREMRANGEBYLEX key minvalue maxvalue

示例

//添加值,其中 a、d、e的分值相同
zadd key 0 a 1 b 2 c 0 e 0 d

//删除a d两个值,
 ZREMRANGEBYLEX key [a [d

3、删除指定分值区间内的所有值

    删除指定分值区间内的所有值,返回删除的值的数量

语法

ZREMRANGEBYSCORE key minscore maxscore

示例

//添加值
zadd key 0 a 1 b 2 c 0 d 0 e

//删除分值1到3之间的值
zremrangebyscore key 1 3

4、删除指定范围内的值

    删除指定范围内的值,返回删除的数量,位置从0开始 , -1为最后一个值

语法

ZREMRANGEBYRANK key start stop

示例

//添加值,排序后的顺序是 a d e b c
zadd key 0 a 1 b 2 c 0 d 0 e

//删除位置1到3之间的值,即删除 d e b
zremrangebyscore key 1 3

五、查询
1、查询集合中值的数量

语法

ZCARD key

示例

zcard key

2、查询集合中指定分值范围内的值的数量

语法

ZCOUNT key minscore maxscore

示例

zcount key 0 10

3、查询指定范围内的值

    查询集合中指定范围内的值,0表示第一个值,-1表示最后一个值

语法 

ZRANGE key start stop [WITHSCORES]

其中

withscores:返回值的分值

示例

//查询所有值
zrange  key 0 -1
//查询所有值,并返回值和分值
zrange key 0 -1 withscores

4、查询同一分值中指定值范围的值

    查询同一分值中指定值范围的值,当值以“[”开头,表示结果中包含此值,当值以“(”开头,表示结果中不包含此值。

如果指定的值范围包含了多个分值,则查询的结果不一定准确

语法

ZRANGEBYLEX key min max [LIMIT offset count]

其中

min为最小值,min为“-”时,表示查询所有比max小的值

max为最大值,max为“+”时,表示查询所有比min大的值

limit为分页

offset为返回结果的起始位置,从0开始

count为返回结果的数量

示例

//添加5个相同分值的值
zadd key 0 d 0 a 0 c 0 b 0 e
//mix的值必须小于max,查询结果为空
zrangebylex key  [d  [b
//查询a到c之间的值,包括a但不包括c
zrangebylex key  [a  (c
//查询所有小于等于c的值
zrangebylex key - [c
//查询所有大于等于b的值
zrangebylex key [b +
//查询a到d之间的值,并返回结果中从第二个值开始的两个值
zrangebylex key [a [d limit 1 2

5、查询指定分值之间的值

语法

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

其中

min为最小分值

max为最大分值

withscores为结果是显示分值

limit为分页

offset为开始的位置,从0开始

count为返回的数量

示例

//添加5个值
zadd key 0 b 1 c 2 a 3 d 4 e
//查询分值在0 到2之间的值
zrangebyscore key 0 2
//查询分值在0到2之间的值和分值
zrangebyscore key 0 2 withscores

//查询分值在0到2之间的值和分值,返回从第3个值开始的一个值
zrangebyscore key 0 10 withscores limit 2 1

6、查询指定范围内的值

此方法的查询结果的顺序正好与zrange的相反。相当于zrange的反转操作

语法

ZREVRANGE key start stop [WITHSCORES]

示例

//添加6个值
zadd key 0 b 1 e 2 a 3 d 4 c 5 f
//查询结果为:b、0、e、1、a、2、d、3、c、4、f、5
zrange key 0 -1 withscores
//查询结果为:f、5、c、4、d、3、a、2、e、1、b、0
zrevrange key 0 -1 withscores

7、查询同一分值中指定值范围内的值

此方法结果结果的顺序与zrangebylex相反,相当于zrangebylex的反转操作

语法

ZREVRANGEBYLEX key max min [LIMIT offset count]

示例

8、查询指定分值范围之内的值

此方法结果结果的顺序与zrangebyscore相反,相当于zrangebyscore的反转操作

语法 

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

示例

//添加6个值
zadd key 0 b 1 e 2 a 3 d 4 c 5 f
//查询结果为:b、e、a、d
zrangebyscore key 0 3
//查询结果为:d、a、e、b
zrevrangebyscore key 3 0

9、查询值在集合中从前向后计算的位置

位置从0开始

语法

ZRANK key member

示例

//添加6个值
zadd key 0 b 3 e 9 a 6 d 10 c 7 f

//查询z的值,结果为4
zrank key a

10、查询值在集合中从后向前计算的位置

位置从0开始

语法 

ZREVRANK key member

示例

//添加6个值
zadd key 0 b 3 e 9 a 6 d 10 c 7 f

//查询a距最后一个元素的位置,结果为1
zrevrank key a

11、查询指定值的分值

语法 

ZSCORE key member

示例

//添加6个值
zadd key 0 b 3 e 9 a 6 d 10 c 7 f
//查询a的分值,结果为9
zscore key a

六、交、并集

1、查询指定数量集合的交集

语法

zinter numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]

numkeys为要计算交集的集合数量

key为集合名

aggregate:结果中分值的计算方式,sum为各集合中分值之和,min为取最小的分值,max为取最大的分值

weights为分值的权重,即原来的分值乘以此值为新的分值,比如某值在a集合中的分值为2,在b集合中的分值为3,而权重分别为2和1,则交集的分值为2*2 + 3*1 = 7,如果aggregate为min,则结果的分值为3*1 = 3

withscores为查询结果中显示分值

示例

zadd key1 0 a 1 b 2 c

zadd key2 0 b 1 c 2 d
//结果为b、1、c、3
zinter 2 key1 key2 withscores
//结果为b、2、c、7
zinter 2 key1 key2 weights 2 3 withscores
//结果为:b、0、c、3
zinter 2 key1 key2 weights 2 3 aggregate min withscores
//结果为:b、2、c、4
zinter 2 key1 key2 weights 2 3 aggregate max withscores

2、查询多个集合中交集值的数量

语法

zintercard numkeys key [key ...] [LIMIT limit]

其中

limit为最多查询多少个结果

示例

zintercard 2 key1 key2 limit 2

3、查询指定数量集合的交集并保存到指定集合中

    查询指定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。

语法 

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

其中

destiontion为查询结果保存的集合名,如果不存在则创建

numkeys为要计算交集的集合数量

key为集合名

aggregate:结果中分值的计算方式,sum为各集合中分值之和,min为取最小的分值,max为取最大的分值

weights为分值的权重,即原来的分值乘以此值为新的分值,比如某值在a集合中的分值为2,在b集合中的分值为3,而权重分别为2和1,则交集的分值为2*2 + 3*1 = 7,如果aggregate为min,则结果的分值为3*1 = 3

示例

zadd key1 0 a 1 b 2 c

zadd key2 0 b 1 c 2 d
//结果为b、1、c、3
zinterstore key3  2 key1 key2
//结果为b、2、c、7
zinterstore key3 2 key1 key2 weights 2 3
//结果为:b、0、c、3
zinterstore key3 2 key1 key2 weights 2 3 aggregate min
//结果为:b、2、c、4
zinterstore key3  2 key1 key2 weights 2 3 aggregate max

4、查询多个集合的并集

语法

zunion numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]

示例

zadd key1 0 a 1 b 2 c

zadd key2 0 b 1 c 2 d
//查询结果为:a、0、b、1、d、1、c、4
zunion 2 key1 key2

5、查询多个集合的并集,并把结果保存到新的集合中

语法 

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

示例

zadd key1 0 a 1 b 2 c

zadd key2 0 b 1 c 2 d
//查询结果为:a、0、b、1、d、1、c、4
zunionstore key3 2 key1 key2

 文章来源于哔站《Redis中zSet类型的操作》

更多学习视频和专栏文章请到哔站个人空间: 布道师学院的个人空间-布道师学院个人主页-哔哩哔哩视频

更多资源和项目下载请到:”开源吧(找实战项目和毕设项目的好网站)“ ​ :开源吧

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

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

相关文章

NPM使用

nodejs 安装查看:windows11 安装Nodejs-CSDN博客 一、初始化项目 1、创建文件夹 E:\vue\projectCode\npm-demo 2、打开cmd 进入E:\vue\projectCode\npm-demo目录输入cmd 点击回车 3、先看看npm命令是否可用 npm -v 4、初始化项目 npm init package name: (npm…

动态内存管理函数(malloc,calloc,realloc,free)

动态内存函数 1.1malloc和free C语言提供了一个动态内存开辟的函数: void* malloc (size_t size); 这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。 如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败&#…

基于YOLOv8模型的120类狗狗目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型的120类狗狗目标检测系统可用于日常生活中检测与定位车辆目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

CMYK to RGBA

1、 算法原理 我们首先来看算法原理: 显而易见,CMYK是存储起来的四个值,通过变换可以转换成RGBA值,其中A值始终为255 2、原始代码 // The original code uses a macro UNROLL8 to unroll code and // each iteration processes eight pixels. // // The macro actually…

Spring的AOP开发-AOP简介

目录 AOP简介 AOP概念 AOP思想的实现方案 模拟AOP的基础代码 AOP相关概念 AOP简介 AOP概念 AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的生化,OOP是纵向对一个事务的抽象,一个对象包括静…

AIGC之下的创意革命,每个人都是文明的设计师

创意,人类文明的灵魂和火花。人类族群进入文明社会以来,创作基本由少数精英主导,以孔子为代表的东方教育家、哲学家提出由“学在民间”替代“学在官府”的知识传播体系也并未得到真正构建,作品一贯通过有限的渠道传播,…

rsync 远程同步实现快速、安全、高效的异地备份

目录 1 rsync 远程同步 1.1 rsync是什么? 1.2 rsync同步方式 1.3 rsync的特性 1.4 rsync的应用场景 1.5 rsync与cp、scp对比 1.6 rsync同步源 2 配置rsync源服务器 2.1 建立/etc/rsyncd.conf 配置文件 3 发起端 4 发起端配置 rsyncinotify 4.1 修改rsync…

VB编程实现股票量化交易之K线图显示

最近在一个朋友的推荐下,开始研究股票的量化交易系统的开发,这里除了股票数据接口 要实现量化交易不难,基本点就是要有股票数据接口和股票交易接口,还有一些针对指标的策略算法。 Private Function CursorInfo(x As Integer, y A…

java:代理模式

概念代理模式 概念: 真实对象:被代理的对象,背景的联想总部代理对象:也就是那个西安联想代理商代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 实现方式: 静态代理:有一…

vuejs中使用axios时如何追加数据

前言 在vuejs中使用axios时&#xff0c;有时候需要追加数据,比如,移动端下拉触底加载,分页加载,滑动滚动条,等等,这时候就需要追加数据了,下面我们来演示下. 代码演示 <template><div><div><el-button type"primary" click"handleBtnGetJ…

AK F.*ing leetcode 流浪计划之最近公共祖先(倍增算法)

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 本期话题&#xff1a;在树上查找2个结点的最近公共祖先 问题提出 最近公共祖先定义 最近公共祖先简称 LCA&#xff08;Lowest Common Ancestor&#xff09;。两个节…

STM32MP157汇编流水灯

.text .global _start _start: /* 使能GPIOE、GPIOF寄存器 RCC_MP_AHB4ENSETR * 基地址: 0x50000000 偏移地址: 0xA28 0x50000A28* RCC_MP_AHB4ENSETR[4]->1 RCC_MP_AHB4ENSETR[5]->1*/ LDR R0,0x50000A28LDR R1,[R0]ORR R1,R1,#(0x1<<4)STR R1,[R0]LDR R0,0x…

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)

目录 作用域 局部作用域 函数作用域 块作用域 全局作用域 作用域链 JS垃圾回收机制 垃圾回收机制算法说明&#xff1a; 引用计数法(了解)&#xff1a; 标记清除法&#xff1a; 闭包 为什么要有闭包&#xff1f; 闭包的风险→内存泄漏 变量提升 函数进阶 函数提升…

前端uniapp如何修改下拉框uni-data-select下面的uni-icons插件自带的图片【修改uniapp自带源码图片/图标】

目录 未改前图片未改前源码未改前通过top和bottom 和修改后图片转在线base64大功告成最后 未改前图片 未改前源码 然后注释掉插件带的代码&#xff0c;下面要的 未改前通过top和bottom 和修改后 找到uni-icons源码插件里面样式 图片转在线base64 地址 https://the-x.cn/b…

防火墙是什么?F5保护Web应用的思路解读

Web 应用防火墙 (WAF) 是保护 Web 应用的必要措施。如今&#xff0c;WAF 需要在部署环境不断扩展但人员技能有限的情况下&#xff0c;保护数量日益增长的应用。那么防火墙是什么&#xff1f;作为一家提供多云应用安全和应用交付的公司&#xff0c;F5为保护Web应用又打造出哪些产…

javaWeb宠物领养系统

一、引言 1.1 系统背景 计算机网络的发展&#xff0c;促进了社会各行业的进步&#xff0c;带来了经济快速增长。管理员通过流浪宠物的信息&#xff0c;在平台上和领养人进行实时的交流&#xff0c;达成领养协议。用户登录后&#xff0c;把想要领养的宠物向本平台发起申请&…

软件安全测试的含义是什么?

早在信息行业发展的初期&#xff0c;就有互联网公司意识到了保护软件产品安全的重要性&#xff0c;可时至今日&#xff0c;我们总能够从报道中瞥见某某公司遭黑客入侵导致信息泄露的新闻&#xff0c;其中甚至不乏Facebook这些以用户通讯、身份信息为支柱产业的大厂。 信息安全事…

【全网最详细的OSPF原理总结,看这篇就够了!】

OSPF是一种基于链路状态的路由协议&#xff0c;也是专为 IP 开发的路由协议&#xff0c;直接运行在 IP 层上面。它从设计上保证了无路由环路。除此之外&#xff0c;IS-IS也是很常见的链路状态协议。 为什么会出现OSPF&#xff1f; 作为目前主流的IGP协议&#xff0c;OSPF主要…

vs code拉取代码到本地汉字乱码--解决

首先&#xff0c;默认情况下&#xff0c;我们使用VS Code打开一个utf-8编码的文件和一个gb2312编码的文件&#xff0c;期中gb2312文件乱码了。 VSCode通常默认UTF-8编码。 解决方法&#xff1a; 点击右下角的编码按钮&#xff08;图中为UTF-8&#xff09;&#xff0c;然后选…

46 二叉树展开为链表

二叉树展开为链表 理解题意&#xff1a;前序遍历的N种写法题解1 前序遍历题解2 反前序遍历(代码简洁)题解3 类似旋转的方法题解4 迭代题解5 同时遍历改左右子树 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNo…