Redis 常用数据类型之 zset

news2025/7/14 12:52:45

目录

一、zset数据结构

二、Redis的zset

三、详细操作

基础操作(zadd、zcrad、zcount)

排序操作(zrange 、zrevrange )

根据分数显示元素(zrangebyscore)

删除操作(zrem、zremrangebyrank、zremrangebyscore)


一、zset数据结构

相比于set,sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表。

zset有两种不同的实现,分别是zipList和skipList。

zipList:
满足以下两个条件:

  • [score,value]键值对数量少于128个;
  • 每个元素的长度小于64字节;

skipList:
不满足以上两个条件时使用跳表(组合了hash和skipList)

  • hash用来存储value到score的映射,这样就可以在O(1)时间内找到value对应的分数;
  • skipList按照从小到大的顺序存储分数;
  • skipList每个元素的值都是[score,value]对
     

二、Redis的zset

Redis 中 zset 不是单一结构完成,是跳表和哈希表共同完成。


实现方式:Redis sorted set的内部使用HashMap和跳跃表(skipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

使用zipList的示意图如下所示:

img

使用跳表时的示意图:

img

hash用于记录权重

ps:跳表介绍可以参考如下文章 

Redis 跳跃表的原理和实现_redis跳表原理_击水三千里的博客-CSDN博客

三、详细操作

基础操作(zadd、zcrad、zcount)

127.0.0.1:6379> zadd books 49 java 79 springboot 80 python 50 php        # 添加元素
(integer) 4
127.0.0.1:6379> zadd books 30 java2
(integer) 1
127.0.0.1:6379> zcard books                                              # 查看数量
(integer) 5
127.0.0.1:6379> zcount books 0 3                                         # 根据分数显示指定的元素,有没有分数在 0 到 3 的数据,这里就返回 0
(integer) 0
127.0.0.1:6379> zcount books 0 70                                        # 返回分数在 0 到 70 之间的数据
(integer) 3
127.0.0.1:6379>

排序操作(zrange 、zrevrange )

127.0.0.1:6379>zrange books 0 -1                                        # 顺序查询集合中的成员
1) "java2"
2) "java"
3) "php"
4) "springboot"
5) "python"
127.0.0.1:6379> zrevrange books 0 -1                                     # 倒序查看集合中的成员
1) "python"
2) "springboot"
3) "php"
4) "java"
5) "java2"
127.0.0.1:6379>

根据分数显示元素(zrangebyscore

这里有一个内置值 inf,表示无穷,  -inf 表示负无穷, +inf 表示正无穷

127.0.0.1:6379> zrangebyscore books -inf +inf                # 显示元素从大到小排序
1) "java2"
2) "java"
3) "php"
4) "springboot"
5) "python"
127.0.0.1:6379> zrangebyscore books -inf +inf withscores     # 显示元素从大到小,并且附带成绩
 1) "java2"
 2) "30"
 3) "java"
 4) "49"
 5) "php"
 6) "50"
 7) "springboot"
 8) "79"
 9) "python"
10) "80"
127.0.0.1:6379> zrangebyscore books -inf 50 withscores        # 显示元素 <= 50 的那部分
1) "java2"
2) "30"
3) "java"
4) "49"
5) "php"
6) "50"
127.0.0.1:6379>

删除操作(zrem、zremrangebyrank、zremrangebyscore)

127.0.0.1:6379> zrem books java                    # 删除指定元素
(integer) 1
127.0.0.1:6379> zrange books 0 -1
1) "java2"
2) "php"
3) "springboot"
4) "python"
127.0.0.1:6379> zremrangebyrank books 0 -1         # 根据数组下标删除指定的元素
(integer) 4
127.0.0.1:6379> zrange books 0 -1
(empty list or set)
127.0.0.1:6379>
127.0.0.1:6379> zadd mysort 10 key1 20 key2 30 key3 40 key4            #  重新添加集合元素
(integer) 4
127.0.0.1:6379> zadd mysort 10 key5 30 key6
(integer) 2
127.0.0.1:6379> zrange mysort 0 -1                                     # 查看集合中的元素
1) "key1"
2) "key5"
3) "key2"
4) "key3"
5) "key6"
6) "key4"
127.0.0.1:6379> zremrangebyrank mysort 0 2                            # 根据数组的下标来删除元素
(integer) 3
127.0.0.1:6379> zrange mysort 0 -1
1) "key3"
2) "key6"
3) "key4"
127.0.0.1:6379> zrangebyscore mysort -inf +inf WITHSCORES
1) "key3"
2) "30"
3) "key6"
4) "30"
5) "key4"
6) "40"
127.0.0.1:6379> zremrangebyscore mysort 0 1                         # 根据分数来删除,但是此时没有分数满足 0 到 1 删除的结果就为 0
(integer) 0
127.0.0.1:6379> zrange mysort 0 -1                                  # 再次查看
1) "key3"
2) "key6"
3) "key4"
127.0.0.1:6379> zremrangebyscore mysort 0 35                        # 再次根据分数来删除
(integer) 2
127.0.0.1:6379> zrange mysort 0 -1
1) "key4"
127.0.0.1:6379>

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

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

相关文章

DSPE-PEG-TCO;磷脂-聚乙二醇-反式环辛烯科研用化学试剂简介

中文名称 磷脂-聚乙二醇-反式环辛烯 英文名称 DSPE-PEG-TCO 外观&#xff1a;粉末或半固体&#xff0c;取决于分子量。 溶剂&#xff1a;溶于大部分有机溶剂&#xff0c;如&#xff1a;DCM、DMF、DMSO、THF等等。在水中有很好的溶解性 稳定性&#xff1a;冷藏保存&#xff…

安装包UI美化之路-通过nsNiuniuSkin来做Electron程序的打包、发布与升级

nsNiuniuSkin从发布之初&#xff0c;因其简单、简洁、高效&#xff0c;受到了非常多公司的青睐&#xff0c;现在已经越来越多的公司采用我们的这套解决方案来制作安装包了&#xff01; 从一个安装包UI插件&#xff0c;逐步演化成一套集美观、安全、简洁、自动化为一体的完整的…

ModBus RTU与ModBus TCP通信协议详解

1、Modbus简介 Modbus通信协议由Modicon公司&#xff08;现已经为施耐德公司并购&#xff0c;成为其旗下的子品牌&#xff09;于1979年发明的&#xff0c;是全球最早用于工业现场的总线规约。由于其免费公开发行&#xff0c;该协议免费使用&#xff0c;Modbus通信协议采用的是主…

电力电子技术复习笔记

绪论电力电子器件直流-直流直流直流动态模型整流电路逆变电路&#xff1a;有源逆变软开关电路期末绪论 电力电子技术&#xff1a;使用电力电子器件对电能进行转换和控制的技术 电力电子技术和信息电子技术的本质区别&#xff1a; 电力电子技术主要用于电能变换 信息电子技术…

2023什么蓝牙耳机好用不贵?适合学生党的国产蓝牙耳机推荐

蓝牙耳机因为摆脱了线的束缚&#xff0c;在日常生活中解放了双手&#xff0c;使用更便捷。现如今的蓝牙耳机越来越多&#xff0c;每款耳机都有自己的侧重。下面&#xff0c;我来给大家推荐几款好用不贵发国产蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱蓝牙耳机 参考…

Linux操作系统基础知识命令参数详解

Linux操作系统 RAID分组 RAID JBOD RAID JBOD的意思是Just a Bunch Of Disks&#xff0c;是将多块硬盘串联起来组成一个大的存储设备&#xff0c;从某种意义上说这种类型不被算作RAID&#xff0c;在维基百科里JBOD同时也被归入非RAID架构。RAID JBOD将所有的磁盘串联成一个单…

【聚类指标】如何评估聚类算法:外部指标和内部指标、指标详解

【聚类指标】如何评估聚类算法&#xff1a;外部指标和内部指标、指标详解 文章目录【聚类指标】如何评估聚类算法&#xff1a;外部指标和内部指标、指标详解1. 前言2. 外部指标2.1 P&#xff08;Purity&#xff09;2.1.1 例子2.2 NMI&#xff08;Normalized Mutual Information…

PHP基础(1)

PHP基础PHP简介解析器最简单的PHP文件传值与传址输出函数数据类型数据类型比较单双引号的区别字符串及常用函数PHP简介 PHP是最常用的动态web开发语言&#xff0c;用于开发动态网站。常见的动态web开发语言还有: asp aspx.jsp(javaweb)。PHP可以嵌入到html中执行&#xff0c;使…

webpack打包ts代码

webpack整合 通常情况下&#xff0c;实际开发中我们都需要使用构建工具对代码进行打包&#xff1b; TS同样也可以结合构建工具一起使用&#xff0c;下边以webpack为例介绍一下如何结合构建工具使用TS&#xff1b; 步骤如下&#xff1a; (1)初始化项目 进入项目根目录&…

IDE 文档注释使用,模板注释,ide配置templates

文档注释基于javadoc模板 类注释 /*** 暂无介绍** author admin* version 1.0.0* <dt><span class"simpleTagLabel">时间:</span></dt>* <dd>2023/2/24</dd>*/方法注释 /*** 暂无描述** author admin* param args */javadoc相…

PowerShell Install Redis

Redis 前言 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 Redis dowload Redis WindowsdownloadRedi…

字节在职5年,一个测试工程师的坎坷之路

几年前进入到IT行业&#xff0c;现在发现学习软件测试的人越来越多&#xff0c;今天我想根据自己的行业经验给大家提一些建议。 跟其他行业相比&#xff0c;做软件测试的岗位确实算是高薪职业&#xff0c;我们那个时候起步的工资并不高&#xff0c;而看现在很多毕业的学生薪资都…

Scala-面向对象引入(包、类和对象)

包 包对象 导包 类和对象 方法和构造器 包 Scala 包的三大作用&#xff08;和 Java 一样&#xff09;&#xff1a; 区分相同名字的类当类很多时&#xff0c;可以很好的管理类控制访问范围 基本语法 package 包名 Scala 有两种包的管理风格&#xff0c;一种方式和 Java …

Transformer模型

图1图2第一张图transfomer模型图&#xff0c;第二张图是是以各个功能模块的形式来呈现transformer的。 在这里我们来讲transformer的几个关键技术: 1.encoder部分的位置嵌入 2.encoder部分的多头注意力机制 3.残差连接 4.LayerNormalization 5.decoder部分的多头注意力的…

如何使用U-Mail搭建企业邮件服务器?

在当今的信息时代&#xff0c;企业也应该跟上时代的步伐。做好企业信息化建设&#xff0c;对企业事业单位尤为重要。电子邮件作为企业信息化过程中的重要组成部分&#xff0c;在企业内部沟通和外部沟通中发挥着重要作用。目前&#xff0c;有实力的企业已经开始倾向于自己搭建邮…

SpringBoot2 黑马 运维实用 01 工程打包与运行

文章目录打包Windows环境运行Windows端口占用使用的排查指令Linux环境运行Linux常用命令jar包导入linux启动jar打包 使用Maven-项目-生命周期-package或者输入命令 mvn package 打包后是一个 .jar 后缀的压缩包 classes是你写的代码 lib是程序运行所依赖的所有jar包 org是启动…

Jenkins配置项目教程

在上一篇[Jenkins的使用教程](https://blog.csdn.net/weixin_43787492/article/details/129028131?spm1001.2014.3001.5501)中我介绍了如何创建一个项目 Jenkins在创建项目中提供了很多功能供我们选择&#xff0c;这里我将对配置项目做一个较完整的介绍Jenkins配置项目0、所有…

ChatGPT 的工作原理:机器人背后的模型

这篇对支持 ChatGPT 的机器学习模型的温和介绍&#xff0c;将从大型语言模型的介绍开始&#xff0c;深入探讨使 GPT-3 得到训练的革命性自我注意机制&#xff0c;然后深入研究人类反馈的强化学习&#xff0c;使 ChatGPT 与众不同的新技术。 大型语言模型 ChatGPT 是一类被称…

mybatis入门配置

mybatis mybatis是一款持久层框架&#xff0c;用于简化JDBC开发 持久层&#xff1a;负责将数据保存到数据库的那一层代码JavaEE的三层架构&#xff1a;表现层、业务层、持久层、&#xff0c;就相当与mvc设计模式过程中的Controller、service、dao 1.创建一个maven模块&#…

【离线数仓-7-数据仓库开发DIM层设计要点-每日全量表同步】

离线数仓-7-数据仓库开发DIM层设计要点-每日全量表同步离线数仓-7-数据仓库开发DIM层设计要点-每日全量表同步1.DIM层 维度模型 设计要点1. 维度表的相关设计2.维度表 设计要点2.DIM层 各维度表分析1.商品维度表1.商品维度表 前期梳理2.商品维度表 DDL表设计分析3.商品维度表 加…