*Redis ZDIFFSTORE 命令

计算多个 Sorted Set 的差集,并将结果存入 destination。Redis 6.2+ 引入。


*语法

ZDIFFSTORE destination numkeys key [key ...]

*参数说明

参数 类型 必填 说明
destination String 目标 Sorted Set 键名
numkeys Integer 源集合数量
key String 源 Sorted Set 键名

*返回值

条件 返回值
计算完成 结果集合的 member 数量(Integer)

*时间复杂度

O(N*log(M)),N 为最小集合大小,M 为最大集合大小。


*示例

> ZADD zset1 1 a 2 b 3 c
> ZADD zset2 1 b 2 c 3 d

> ZDIFFSTORE result 2 zset1 zset2
(integer) 1

> ZRANGE result 0 -1 WITHSCORES
1) "a"
2) "1"

*常见错误

错误 原因 解决
ERR wrong number of arguments numkeys 和实际传入的 key 数量不一致 调用前确认源集合数量,确保 numkeys 与实际 key 数量一致
WRONGTYPE Operation against a key holding the wrong kind of value 源 key 类型不是 Sorted Set 使用 TYPE 命令确认所有源 key 类型为 zset
覆盖已有 destination 导致数据丢失 destination 已存在会被覆盖 执行前检查 destination 是否存在,或选择合理的键名避免冲突

*最佳实践

  1. 差集缓存:计算差集结果存入新 key 缓存,避免重复计算。

  2. numkeys 校验:调用前确认源集合数量,确保 numkeys 与实际 key 数量一致。

  3. 差集结果缓存:差集计算开销大,结果存入 key 后设置 TTL 避免重复计算。

  4. 大数据量分批:源集合过大时,考虑分批次取差集或使用 Lua 脚本在服务端处理。

*5. 版本兼容性:ZDIFFSTORE 是 Redis 6.2+ 命令,低版本需使用 ZRANGESTORE 替代方案。

*FAQ

Q1: ZDIFFSTORE 和 ZDIFF 有什么区别? A: ZDIFF 返回结果数组;ZDIFFSTORE 存入新 Sorted Set。大数据量用 ZDIFFSTORE 避免网络阻塞。

Q2: ZDIFFSTORE 的 numkeys 包含 destination 吗? A: 不包含。numkeys 仅指源 key 的数量,destination 单独作为第一个参数。

Q3: 差集结果中 score 是怎么来的? A: 来自第一个源集合中对应 member 的 score。

Q4: ZDIFFSTORE 和 ZDIFF 在内存使用上有区别吗? A: ZDIFF 需要将所有结果发送到客户端,网络开销大;ZDIFFSTORE 在服务端写入内存,网络开销小。

Q5: 两个集合完全相同,差集是什么? A: 空集合,ZDIFFSTORE 返回 0 并清空 destination。