Redis ZDIFF 怎样找出排名集合之间的成员差集
Redis ZDIFF numkeys key [key ...] [WITHSCORES] 返回第一个有序集合中存在、后续所有集合中都不存在的成员。它按成员身份求差集,不比较名次是否改变,也不计算同一成员的分数差。比较“本期新增成员”时,把本期集合放第一位、历史集合放后面;需要分数时加 WITHSCORES。
官方地址:https://redis.io/docs/latest/commands/zdiff/
为什么分数变化的成员没有出现在结果里
假设某个榜单成员在前一期得 70 分、本期得 95 分。开发者想找变化项,却发现它不在 ZDIFF 的结果里。这个现象首先应从查询含义解释:成员在两边都存在,分数变化不会使它成为成员差集。
类似地,“本期新增成员”也不等于“本期所有排名变化的人”。前者是成员资格问题;后者需要关联两份分数或名次再计算变化。ZDIFF 适合前者,不能通过添加 WITHSCORES 将它改成后者。

先固定差集的方向和输入数据
下面使用独立示例键,并给它们设置短期过期时间。命令是供读者在测试环境执行的示例,本文未启动 Redis,也不提供虚构执行日志。复用示例时应选择未被其他任务使用的键空间,以免旧成员影响推导。
# 使用独立演示键;花括号部分保持一致,便于集群同槽组织。
redis-cli ZADD 'demo:{zdiff167}:current' 92 member_a 84 member_b 76 member_c 68 member_d
redis-cli ZADD 'demo:{zdiff167}:previous' 70 member_a 80 member_b 60 member_e
redis-cli EXPIRE 'demo:{zdiff167}:current' 300
redis-cli EXPIRE 'demo:{zdiff167}:previous' 300
# numkeys=2 表示后面两个输入键,本期为被减集合。
redis-cli ZDIFF 2 'demo:{zdiff167}:current' 'demo:{zdiff167}:previous' WITHSCORES
# 反过来表示上期存在而本期不存在,业务含义随之改变。
redis-cli ZDIFF 2 'demo:{zdiff167}:previous' 'demo:{zdiff167}:current' WITHSCORES
由给定数据可以推导:本期减上期保留 member_c 和 member_d;上期减本期保留 member_e。member_a 和 member_b 虽然分数变化,仍被排除。这些是集合规则推导,不是实际数据库回执。
第三个及更多集合都起排除作用:只要成员出现在其中任意一个,就不属于结果。因此 A 减 B 再减 C 的成员条件可以理解为 A 中不属于 B 或 C 的成员。不要交换第一个输入来“优化”计算,因为差集方向会改变。
用 WITHSCORES 解释保留成员的分数
保留下来的成员沿用第一个集合中的分数;后面的集合只参与成员排除,不提供分数相减或聚合。WITHSCORES 要求一并返回分数,调用方仍需按所用客户端和 RESP 协议的返回结构读取成员与分数,不能把 redis-cli 的打印版式硬编码成解析规则。
| 想知道什么 | ZDIFF 是否直接解决 | 说明 |
|---|---|---|
| 本期比上期新增哪些成员 | 可以 | 本期放第一位 |
| 上期有哪些成员本期消失 | 可以 | 上期放第一位 |
| 同一成员分数增长多少 | 不直接解决 | 需要按成员关联两份分数 |
| 名次提高了多少位 | 不直接解决 | 需要比较两期名次 |
| 两个方向所有不重复成员 | 单次不够 | 需要分别定义两侧差集再组合 |
如果结果与预期不同,先观察两个输入的成员与分数,再确认键顺序和 numkeys。还要核对周期、租户及榜单规则是否一致;键名相似不能证明它们代表同一份业务口径。
# 观察输入类型与成员,本组命令仅用于理解示例数据。
redis-cli TYPE 'demo:{zdiff167}:current'
redis-cli TYPE 'demo:{zdiff167}:previous'
redis-cli ZRANGE 'demo:{zdiff167}:current' 0 -1 WITHSCORES
redis-cli ZRANGE 'demo:{zdiff167}:previous' 0 -1 WITHSCORES
需要后续排名查询时怎样保存结果
ZDIFF 将结果返回客户端,不创建结果键。如果后续要用 ZRANGE 查询差集榜单,可选择 ZDIFFSTORE,写到独立目标键,再按需要设置过期时间。该命令会覆盖已有目标键,所以应把目标命名空间与输入区分开。
# 将差集保存到专用演示目标键,不覆盖 current 或 previous。
redis-cli ZDIFFSTORE 'demo:{zdiff167}:newcomers' 2 'demo:{zdiff167}:current' 'demo:{zdiff167}:previous'
# 缓存结果设置独立过期时间;读取时可以明确采用降序排名。
redis-cli EXPIRE 'demo:{zdiff167}:newcomers' 120
redis-cli ZRANGE 'demo:{zdiff167}:newcomers' 0 9 REV WITHSCORES
存储结果是计算时输入的派生集合,之后原集合变化不会让它自动同步更新。过期策略也应由结果键自己管理,不应假设它自动继承输入键的 TTL。若不需要持久化派生集合,直接 ZDIFF 能减少结果键生命周期管理。

上线前明确快照与返回规模
Redis 文档标明 ZDIFF 从 6.2.0 提供;接入前应确认部署支持。集群中的多键操作还要符合实际产品的键路由要求;Redis Open Source Cluster 通常要求相关键位于同一槽,本例用相同 hash tag 组织键。不要把单节点能执行直接等同于跨槽也能执行。
差集读取的是执行时的集合状态,而“本期”“上期”是否已经生成完毕是业务问题。若榜单构建仍在进行,结果可能反映一份未完成的数据集。可用明确的周期版本与完成标记组织输入,避免把动态榜单误称为稳定快照。
ZDIFF 没有 LIMIT 参数,结果可能较大。小返回量不代表计算必然廉价,成本还与输入规模有关;应控制调用频率和结果规模。若保存结果再分页,需要同时规划计算成本、临时键空间与过期清理,不能把分页读取当成消除了差集计算成本。
加 WITHSCORES 会比较分数吗?不会,它只改变返回信息;成员排除条件没有变化。
没有结果是不是命令失败?不一定,第一集合所有成员都被排除时,空结果完全合理。客户端错误、输入错误与空数组应分别处理。
改变输入集合的排列有影响吗?第一个集合决定候选成员和保留分数,不能随意交换。后续集合共同承担排除条件。
接口依据:ZDIFF 文档、ZDIFFSTORE 文档。
Redis GEOSEARCHSTORE 怎样把附近地点查询保存为有序集合
- 上一篇
- Redis GEOSEARCHSTORE 怎样把附近地点查询保存为有序集合
- 下一篇
- Redis ZRANGESTORE 怎样保存一段有序集合排名结果
-
- 数据库 · Redis | 1小时前 | Redis · Sorted Set · redis 有序集合 BZMPOP 阻塞消费
- Redis BZMPOP 怎样阻塞等待多个排名集合的数据
- 315浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis LCS 怎样读取两个字符串的公共子序列位置
- 327浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis SORT_RO 怎样只读排序列表中的数值
- 218浏览 收藏
-
- 数据库 · Redis | 1小时前 | Redis · 缓存 · WEIGHTS Count-Min Sketch Redis CMS.MERGE
- Redis CMS.MERGE 怎样给计数草图设置合并权重
- 326浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis LPOS 怎样定位列表中重复值的位置
- 217浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis TDIGEST.BYRANK 怎样按排名查询分位摘要
- 217浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis CMS.INFO 怎样读取计数草图的宽度与深度
- 304浏览 收藏
-
- 数据库 · Redis | 1小时前 | Redis · redis 分位数 TDIGEST.TRIMMED_MEAN TDigest 截尾均值
- Redis TDIGEST.TRIMMED_MEAN 怎样计算指定分位区间的均值
- 137浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis BITFIELD_RO 怎样只读提取打包整数
- 176浏览 收藏
-
- 数据库 · Redis | 1小时前 | Redis · 缓存设计 · redis limit rev 有序集合 BYSCORE Sorted Set ZRANGESTORE BYLEX
- Redis ZRANGESTORE 怎样保存一段有序集合排名结果
- 232浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis GEOSEARCHSTORE 怎样把附近地点查询保存为有序集合
- 237浏览 收藏
-
- 数据库 · Redis | 12小时前 | Redis · redis 性能 limit SUNIONCARD Set并集
- Redis SUNIONCARD 怎样在达到阈值后停止并集计数
- 161浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 727次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 733次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 810次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 772次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 609次使用
-
- Redis Stream XTRIM 如何避免消费组积压无限增长
- 2026-09-12 501浏览
-
- Redis AOF rewrite 期间如何判断磁盘与内存压力
- 2026-09-12 501浏览
-
- Redis RDB 和 AOF 怎么按可接受数据丢失量选择
- 2026-09-08 501浏览
-
- Redis XAUTOCLAIM 之后为什么仍有 pending:JUSTID、PEL 与消息删除边界
- 2026-08-29 501浏览
-
- Redis SET 的 GET 与 KEEPTTL 怎么一起验收:旧值返回、续期与回滚边界
- 2026-08-20 501浏览

