*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 是否存在,或选择合理的键名避免冲突 |
*最佳实践
差集缓存:计算差集结果存入新 key 缓存,避免重复计算。
numkeys 校验:调用前确认源集合数量,确保 numkeys 与实际 key 数量一致。
差集结果缓存:差集计算开销大,结果存入 key 后设置 TTL 避免重复计算。
大数据量分批:源集合过大时,考虑分批次取差集或使用 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。