ZSet 集合运算新版命令是什么
7.0 起,ZSet 的并集、交集、差集运算可以不加 STORE 直接返回结果:ZUNION、ZINTER、ZDIFF 三个命令替代了过去必须先 ZUNIONSTORE / ZINTERSTORE 落库再删临时键的做法。它们支持 WEIGHTS(各输入集的分数乘数)与 AGGREGATE(同一成员分数冲突时的合并方式),还有落库变体 ZDIFFSTORE 与交集基数命令 ZINTERCARD。
基本信息
| 直接返回 | ZUNION / ZINTER / ZDIFF,语法首位是 numkeys |
|---|---|
| 落库变体 | ZUNIONSTORE / ZINTERSTORE / ZDIFFSTORE |
| WEIGHTS | 为每个输入集指定分数乘数 |
| AGGREGATE | SUM(默认)/ 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 变体。