详谈redis之有序集合(ZSET)

2023-11-13

一、前言

有序集合存储着成员(member)和分值(score)的键值对,按照分值从小到大自动排序,具体细节在第一篇blog《详谈redis数据结构》中,不太熟悉的同学可以回去查看。对Java不太熟悉的同学可关注文章末尾的公众号,里面满满干货。

二、命令

2.1 ZADD

ZADD全称zset add
将给定分值的成员添加到有序集合里面

System.out.println(conn.zadd("high",180,"Kelvin"));

查看redis中,已存储该条数据
在这里插入图片描述

2.2 ZREM

ZREM全称zset remove
从有序集合里面移除给定的成员,并返回被移除成员的数量

System.out.println(conn.zrem("high","Kelvin"));

在这里插入图片描述

2.3 ZCARD

ZCARD全称zset card
返回有序集合包含的成员数量

System.out.println(conn.zadd("high",180,"Kelvin"));
System.out.println(conn.zadd("high",160,"Lina"));
System.out.println(conn.zadd("high",177,"Mike"));
System.out.println(conn.zcard("high"));

在这里插入图片描述
在这里插入图片描述
zcard命令返回3.

2.4 ZINCRBY

ZINCRBY全称zset increase by
将成员的分值加上一个给定数。

System.out.println(conn.zincrby("high",2,"Kelvin"));

在这里插入图片描述

2.5 ZCOUNT

ZCOUNT全称zset count
返回分值在[min,max]之间的成员数量

System.out.println(conn.zcount("high",165,190));

在这里插入图片描述

2.6 ZRANK

ZRANK全称zset rank
返回成员在有序集合中的排名

System.out.println(conn.zrank("high","Kelvin"));

在这里插入图片描述

2.7 ZSCORE

ZSCORE全称zset score
返回成员的分值

System.out.println(conn.zscore("high","Kelvin"));

在这里插入图片描述

2.8 ZRANGE

ZRANGE全称zset range
返回有序集合中排名介于[start,stop]之间的成员,如果给定了可选的WITHSCORES选项,那么命令会将成员的分值也一并返回。

为了使我们的有序集合更具有可操作性,先添加一些成员。

//先将high有序集合扩充一下
System.out.println(conn.zadd("high",155,"Jin"));
System.out.println(conn.zadd("high",161,"Yellow"));
System.out.println(conn.zadd("high",172,"Lucy"));

查看redis里面high有序集合存储的信息
在这里插入图片描述
OK,我们现在选择选出身高排名第3到第6之间的同学,(3,6]

System.out.println(conn.zrange("high",3,6));

在这里插入图片描述
由结果得知,zrange的范围是左开右闭。

那么如果我们想拿到(3,6]并且拿到这些同学的分值

System.out.println(conn.zrangeWithScores("high",3,6));

在这里插入图片描述

2.9 ZREVRANK

ZREVRANK全称zset reversal rank
返回成员在有序集合里的排名,按照分值从大到小排列,默认的是从小到大,这里翻转了一下。
在这里插入图片描述
我们可以看到,“Kelvin”排第6,“Yellow”排第3,但是从逆向来看,“Kelvin”为0,“Yellow”为3,那么我们写行代码查看一下。

System.out.println(conn.zrevrank("high","Yellow"));
System.out.println(conn.zrevrank("high","Kelvin"));

在这里插入图片描述

2.10 ZREVRANGE

ZREVRANGE全称zset reverse range
返回有序集合给定排名范围内的成员,成员按照分值从大到小排列

System.out.println(conn.zrevrange("high",1,5));

在这里插入图片描述
ZREVRANGEWITHSCORES
返回有序集合给定排名范围内的成员,并显示分值,成员按照分值从大到小排列

System.out.println(conn.zrevrangeWithScores("high",1,5));

在这里插入图片描述

2.11 ZRANGEBYSCORE

ZRANGEBYSCORE全称zset range by score
返回有序集合中分值介于min和max之间的所有成员
我们挑出分值在160到180之间的成员

System.out.println(conn.zrangeByScore("high",160,180));

在这里插入图片描述

2.12 ZREVRANGEBYSCORE

ZREVRANGEBYSCORE全称zset reversal range by score
获取有序集合中分值介于min和max之间的所有成员,并按照分值从大到小的顺序来返回他们

System.out.println(conn.zrevrangeByScore("high",180,160));

在这里插入图片描述

2.13 ZREMRANGEBYRANK

ZREMRANGEBYRANK全称zset remove range by rank
移除有序集合中排名介于start和stop之间的所有成员
在移除之间先查看一下redis中的数据
在这里插入图片描述
运行代码

System.out.println(conn.zremrangeByRank("high",2,4));

返回被移除的数量
在这里插入图片描述
再次查看redis中的数据
在这里插入图片描述

2.14 ZREMRANGENYSCORE

ZREMRANGEBYSCORE全称zset remove range by score
移除有序集合中排名分值介于start和stop之间的所有成员

为了演示方便,我们将在high有序集合中多添加几行数据

System.out.println(conn.zadd("high",174,"Jay"));
System.out.println(conn.zadd("high",169,"Pei"));
System.out.println(conn.zadd("high",186,"Jone"));

在这里插入图片描述
然后移除170以下的成员

System.out.println(conn.zremrangeByScore("high",0,170));

在这里插入图片描述

2.15 ZINTERSTORE

ZINTERSTORE全称zset inter store
对给定的有序集合做交集运算,默认使用的聚合函数为sum,即默认在做交集操作时将不同集合中相同的成员所对应的分值相加,然后聚合成一个新的有序集合。

先创建两个有序集合

System.out.println(conn.zadd("zset-key1",1,"a"));
System.out.println(conn.zadd("zset-key1",2,"b"));
System.out.println(conn.zadd("zset-key1",3,"c"));
System.out.println(conn.zadd("zset-key2",10,"b"));
System.out.println(conn.zadd("zset-key2",20,"c"));
System.out.println(conn.zadd("zset-key2",30,"d"));

很明显zset-key1和zset-key2的共同成员有"b"和"c",新建一个有序集合用来做两者的交集。

System.out.println(conn.zinterstore("zset-key3","zset-key1","zset-key2"));

在这里插入图片描述
很明显交集就是将两者的共同成员所对应的分值相加。

那么如果我们选用聚合函数MAX,就是在取交集时,选用相同成员中分值较高者为交集的分值要怎么操作呢

ZParams zParams = new ZParams();
zParams.aggregate(ZParams.Aggregate.MAX);
System.out.println(conn.zinterstore("zset-key4",zParams,"zset-key1","zset-key2"));

查看redis中的数据
在这里插入图片描述
同理,如果选用min做为聚合参数,则将代码稍作修改即可

ZParams zParams = new ZParams();
zParams.aggregate(ZParams.Aggregate.MIN);
System.out.println(conn.zinterstore("zset-key3",zParams,"zset-key1","zset-key2"));

在这里插入图片描述

2.16 ZUNIONSTORE

ZUNIONSTORE全称zset union store
对给定的有序集合做并集运算,同样并集运算的聚合函数也可以选用“max”,"min"和“sum”。为了避免重复性说明,我们选用max来做一次并集示范。

ZParams zParams = new ZParams();
zParams.aggregate(ZParams.Aggregate.MAX);
System.out.println(conn.zunionstore("zset-key5",zParams,"zset-key1","zset-key2"));

在这里插入图片描述

总结

redis的五种数据类型的相关命令已经介绍完毕,接下去还会介绍一些redis中常用的其他命令,比如发布与订阅,键过期时间等等。

对Java系列知识感兴趣的朋友可以加入QQ群
慧梦软件开发技术联盟:952317701
更多系列文章在java高级程序开发微信公众号
Java高级开发技术

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详谈redis之有序集合(ZSET) 的相关文章

  • Redis 写入 .ssh/authorized_keys

    当前设置 2 个主服务器 12 个工作服务器 工作人员通过 ssh copy id 连接到主设备 主设备和工作人员正在主设备上的 redis 队列中写入数据 过去一周我遇到的问题是 Redis 正在将数据写入authorized keys
  • 如何在redis中创建自己的数据库?

    There are 0 to 15 databases in redis 我想使用 redis cli 创建自己的数据库 有什么命令可以实现吗 Redis 数据库并不等同于 MySQL 等 DBMS 中的数据库名称 这是一种为键创建隔离和命
  • socket.io redis 和内存泄漏

    我的socket io版本是 电子邮件受保护 cdn cgi l email protection and 电子邮件受保护 cdn cgi l email protection 我在 Windows 上 在某些地方 我看到问题已得到解决 我
  • 使用brew在MacOSx上安装Redis JSON

    如何使用brew 在 macOSx 上安装 RedisJSON 如何在不编译redis的情况下启用redis上的模块 我不想使用 docker 客户端 Redis Stack 可能是最简单的方法 它不仅仅是 RedisJSON 还包括 Re
  • Redis 块推送直到列表有空位

    我正在寻找类似的东西BLPUSH该命令将阻塞 直到列表的长度低于指定值max size 目的是防止生产者运行速度快于消费者时列表无限增长 功能与 python 非常相似Queue put https docs python org 3 li
  • Stackexchange.redis 缺乏“WAIT”支持

    我在客户端应用程序正在使用的负载均衡器后面有 3 个 Web API 服务器 我正在使用这个库来访问具有一个主服务器和几个从服务器的 Redis 集群 目前不支持 WAIT 操作 我需要此功能来存储新创建的用户会话并等待它复制到所有从属服务
  • 使用 AWS ElastiCache 请求中的 Airflow CROSSSLOT 密钥未散列到同一插槽错误

    我在 AWS ECS 上运行 apache airflow 1 8 1 并且有一个 AWS ElastiCache 集群 redis 3 2 4 运行 2 个分片 2 个启用多可用区的节点 集群 Redis 引擎 我已经验证气流可以毫无问题
  • PooledRedisClientManager 未释放连接

    我将 json 数据列表存储在 redis 中并使用 ServiceStack c 客户端访问它 我本质上是在管理自己的外键 我在其中存储zrangeid 我使用应用程序内部的接口从zrange然后从 Redis 获取底层 json 对象并
  • 为什么Redis中不建议使用KEYS?

    在Redis中 建议不要使用按键命令 https redis io commands KEYS 为什么会这样呢 是因为它的时间复杂度是 O N 吗 或者是别的什么原因 我做了下面的实验来证明KEYS命令有多么危险 当带有 KEYS 的一个命
  • Redis hash写入速度非常慢

    我面临一个非常奇怪的问题 使用 Redis 时 我的写入速度非常糟糕 在理想的情况下 写入速度应该接近 RAM 上的写入速度 这是我的基准 package redisbenchmark import redis clients jedis
  • Spring Data Redis JedisConnectionException:流意外结束

    雷迪斯3 0 5Spring数据Redis 1 3 6绝地武士2 6 3 我们的 Web 应用程序通过 pub sub 从 Redis 接收数据 还以键 值对的形式在 Redis 上执行数据读 写 读 写发生在监听线程 独立监控线程和htt
  • redis 阻塞直到 key 存在

    我是 Redis 新手 想知道是否有办法能够await get通过它的键来获取值 直到该键存在 最小代码 async def handler data await self fetch key async def fetch key ret
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • 使用 Redis 命令 incr 和 expire 时的竞争条件

    根据redis文档 http redis io commands incr http redis io commands incr 在段落模式 速率限制器 2 较短的版本代码 value INCR ip IF value 1 THEN EX
  • 如何在Redis中进行持久化存储?

    关闭redis服务器后 使用set存储的值被破坏 在这里我找到了使用持久性存储的方法 有人帮助我 如何使用javascript实现这一点 我想将客户端的一些值存储在 redis 数据库中 并且必须在其他客户端中使用该值 您需要配置 Redi
  • 为什么 Redis TimeSeries 不捕获聚合中的最后一个元素?

    我试图了解 Redis 的时间序列规则创建的工作原理 但我很困惑为什么 Redis 会忽略聚合中的最后一项 并想知道这是否是预期的行为 我在中创建了示例代码redis cli为了显示 127 0 0 1 6379 gt FLUSHALL O
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • 为什么Redis中没有有序的hashmap?

    Redis 数据类型 http redis io topics data types包括排序集 http redis io topics data types intro sorted sets以及其他用于键值存储的必要数据结构 但我想知道
  • 如何在Redis中只保存一个数据库?

    我是 Redis 新手 有一个与备份相关的问题 目前 我有一个实例在 Windows 服务器上运行 在这个实例中 我当前有一项 工作 将数据存储在一个数据库中 我不想备份这些数据 我必须创造一份新工作 我的第一个想法是将数据存储在另一个数据

随机推荐

  • 关于xxxxxxRepository.search()方法一个分页的小陷阱

    背景介绍 我有20几万的数据 现在要推送给别人 这样我势必要从自己的数据库中先查出来 然后一点一点的传给对方 所以我的思路是这样的 20万数据 Repository自带的search方法有分页功能 我只需要传一个pageable给它 告诉它
  • Linux 多线程 ( 多线程概念 )

    文章目录 Linux线程概念 什么是线程 二级页表 线程的优点 线程的缺点 线程异常 Linux线程概念 什么是线程 在一个程序里的一个执行路线叫做线程 thread 更准确的定义为 线程是一个进程内部的控制序列 一切进程至少有一个执行线程
  • TwinCAT3中松下伺服A6BF的全闭环设置步骤

    以TwinCAT3和A6BF进行全闭环测试 带有编码器和绝对式光栅尺 实测有效 扫描硬件 首先安装EtherCAT网口驱动 点击安装网卡驱动 TWINCAT Show Realtime Ethercat Compatibel Devices
  • CAN 为什么需要收发器

    在RTL代码中集成了两个CAN node 打算直接连接将两个node的Rx和Tx对接 发现两个CAN Node无法通信 询问技术支持后才知道必须要收发器 那为什么一定需要收发器呢 除了转换单端的CAN信号用于不同的传输 收发器也会将CANT
  • Unity-ML-Agents安装

    目录 1 下载ML Agents 1 1 前往官网 1 2 选择版本 1 3 下载文件 2 下载Anaconda 3 虚拟环境 3 1 构建虚拟环境 3 2 创建项目 导入package json 3 2 1 创建项目 导入package
  • Linux查询文件行数

    wc l find name c
  • OpenCV之warpPerspective--透视变换

    OpenCV之warpPerspective 透视变换 参考博客链接 https blog csdn net liuphahaha article details 50719275 为了记录自己的学习 一 OpenCV透视变化进行图像中的关
  • 《神经网络与深度学习》-概率图模型

    概率图模型 1 模型的表示 1 1 有向图模型 1 2 常见的有向图模型 1 2 1 Sigmoid信念网络 1 2 2 朴素贝叶斯分类器 1 2 3 隐马尔科夫模型 1 3 无向图模型 1 4 无向图模型的概率分解 1 5 常见的无向图模
  • 【面试总结】设计思想解读开源框架:(1)

    12 策略模式 Strategy Pattern 13 适配器模式 Adapter Pattern 14 迭代器模式 Iterator Pattern 15 组合模式 Composite Pattern 16 观察者模式 Observer
  • gcc- -O 优化选项

    查查gcc手册就知道了 每个编译选项都控制着不同的优化选项 下面从网络上copy过来的 真要用到这些还是推荐查阅手册 O设置一共有五种 O0 O1 O2 O3和 Os 除了 O0以外 每一个 O设置都会多启用几个选项 请查阅gcc手册的优化
  • json文件中数据类别个数统计与类别信息可视化

    将json文件保存的数据信息利用URL下载数据以后 希望将统计出数据集中每一类图片个数 且进行可视化 看数据分布是否均匀 然后在进行相应的操作 数据还是kaggle比赛中提供的数据集 json文件内容如下 python实现上述要求 导入相应
  • Mac创建定时任务

    Mac 有两种方式可以添加定时任务 crontab 命令 launchctl 定时任务 crontab 命令 通过crontab 命令 我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本 时间间隔的单位可以是分钟 小
  • 观察者模式 & 发布-订阅模式(设计模式与开发实践 P8)

    文章目录 观察者模式 运用 实现 观察者模式 定义 他用来定义对象之间一种一对多的依赖关系 当一个对象状态发生改变时 所有依赖他的对象都会得到通知 运用 如果我们使用过 DOM 上的事件函数 那就接触过观察者模式 document body
  • (亲测好用)idea提示内存不足( ran out of available memory)

    idea提示内存不足 ran out of available memory 错误提示 The IDE ran out of available memory Please consider increasing the value of
  • 【LeetCode】3. 无重复字符的最长子串 给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。

    3 无重复字符的最长子串 给定一个字符串s 请你找出其中不含有重复字符的最长子串的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2 输入 s bbbbb 输出 1 解
  • webpack打包优化和打包上线

    通过 npm run serve 启动本地 执行 development 通过 npm run test 打包测试 执行 testing 通过 npm run build 打包正式 执行 production 图片优化 使用 url loa
  • Uniapp低功耗蓝牙操作实例

    uniapp低功耗蓝牙在移动端使用较为平常 本文相较于官方文档介绍一下低功耗蓝牙的操作案例 即取即用 低功耗蓝牙虽工作原理与经典蓝牙类似 但是有着独特的架构体系 所以LE独立出来成为一种蓝牙形态 不过LE和经典蓝牙使用相同的2 4G无线电频
  • 机器学习好伙伴之scikit-learn的使用——datasets获得数据集

    机器学习好伙伴之scikit learn的使用 datasets获得数据集 载入sklearn中自带的datesets 利用sklearn的函数生成数据 应用示例 利用sklearn中自带的datesets进行训练 利用sklearn中生成
  • 使用ASMD 来描述硬件电路并辅助verilog 代码的编写

    TOC 使用ASMD 来描述硬件电路并辅助verilog 代码的编写 ASMD 的定义 ASM 算法状态机 图是描述时序状态机的一种抽象 类似于软件流程图 描述状态机的动作 但是ASM 图只显示控制信号和行为动作 控制状态 不显示存储元件所
  • 详谈redis之有序集合(ZSET)

    一 前言 有序集合存储着成员 member 和分值 score 的键值对 按照分值从小到大自动排序 具体细节在第一篇blog 详谈redis数据结构 中 不太熟悉的同学可以回去查看 对Java不太熟悉的同学可关注文章末尾的公众号 里面满满干