首页/数据/数据库速查/ZSet 集合运算新版:ZUNION/ZINTER/ZDIFF
Redis 命令96 条

ZSet 集合运算新版:ZUNION/ZINTER/ZDIFF

7.0 起 ZSet 集合运算可以不加 STORE 直接返回结果:ZUNION/ZINTER/ZDIFF 支持 WEIGHTS 与 AGGREGATE,落库变体 ZDIFFSTORE/ZINTERCARD 按需使用。

数据库速查数据更新于 2026-10-13

ZSet 集合运算新版命令是什么

7.0 起,ZSet 的并集、交集、差集运算可以不加 STORE 直接返回结果:ZUNION、ZINTER、ZDIFF 三个命令替代了过去必须先 ZUNIONSTORE / ZINTERSTORE 落库再删临时键的做法。它们支持 WEIGHTS(各输入集的分数乘数)与 AGGREGATE(同一成员分数冲突时的合并方式),还有落库变体 ZDIFFSTORE 与交集基数命令 ZINTERCARD。

基本信息

直接返回ZUNION / ZINTER / ZDIFF,语法首位是 numkeys
落库变体ZUNIONSTORE / ZINTERSTORE / ZDIFFSTORE
WEIGHTS为每个输入集指定分数乘数
AGGREGATESUM(默认)/ MAX / MIN,处理同一成员的分值冲突
WITHSCORES放在命令末尾,输出成员与最终分数

典型使用场景

  • 多榜单合并:把若干子榜单按权重合成总榜,直接返回结果省去临时键
  • 共同成员筛选:用 ZINTER 取多个集合的交集并按分数排序
  • 排除成员:用 ZDIFF 取「在 A 不在 B」的成员,用于遍历差异集合
  • 条件计数:用 ZINTERCARD 判断是否至少存在若干个共同成员
  • 权重调优:调整 WEIGHTS 比较不同权重下的排序结果,无需反复落库清理

用法示例

用法示例
ZADD z1 1 a 2 b
ZADD z2 10 b 20 c
# 并集:按权重 1 与 2 合成,SUM 处理重复成员
ZUNION 2 z1 z2 WEIGHTS 1 2 AGGREGATE SUM WITHSCORES
# 交集
ZINTER 2 z1 z2 WITHSCORES
# 差集:只在 z1 不在 z2 -> a
ZDIFF 2 z1 z2 WITHSCORES
# 差集落库
ZDIFFSTORE out 2 z1 z2
# 交集基数(7.0):判断至少有多少共同成员
ZINTERCARD 2 z1 z2 LIMIT 1

命令与选项适用性

命令支持 WEIGHTS支持 AGGREGATE结果落库
ZUNION支持支持需 ZUNIONSTORE
ZINTER支持支持需 ZINTERSTORE
ZDIFF不支持不支持需 ZDIFFSTORE
ZINTERCARD不支持不支持只返回基数计数
WEIGHTS 只影响分数计算,不改变成员的取舍规则:并集仍是成员全收,交集仍取共同成员,权重只决定最终排序分值。
交集与并集的复杂度与集合规模相关,元素规模大时单条命令会长时间占用主线程,高并发下建议先在业务侧收敛集合规模或离线计算后再取用结果。
迁移提示:老代码里 ZUNIONSTORE 落库再读取再删临时键的三步流程,可以直接换成 ZUNION 一步返回。除了少一次网络往返,也避开了临时键残留与并发覆盖的问题。需要把结果长期保留或供其他客户端读取时,再继续使用 STORE 变体。

易错点

  • 给 ZDIFF 传 WEIGHTS 或 AGGREGATE:差分没有加权与聚合语义,参数直接报错
  • 数值参数顺序写错:numkeys 必须写在最前面且与后续键数量一致,写错会解析失败或读到错误的键
  • 集群下多键不同槽:集合运算的多键必须同槽,否则报跨槽错误,需要用 hash tag 对齐键名
  • 以为 ZINTERCARD 返回的是完整交集:它只返回基数计数,需要成员列表还得用 ZINTER
  • WITHSCORES 写在中间:该选项必须位于命令末尾,位置写错会导致语法错误

数据来源与参考

  • Redis 官方文档: ZUNION
  • Redis 官方文档: ZDIFF

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌