*Redis CF.LOADCHUNK 命令
CF.LOADCHUNK 从之前使用 CF.SCANDUMP 保存的数据块中恢复 Cuckoo Filter。
*语法
CF.LOADCHUNK key iterator data
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 要恢复的 Cuckoo Filter 键名 |
| iterator | Integer | 是 | 迭代器值(由 CF.SCANDUMP 返回) |
| data | String / Bytes | 是 | 当前数据块(由 CF.SCANDUMP 返回) |
*返回值
- OK:成功恢复数据块
- Simple error reply:参数无效、键类型错误、数据格式错误等
*时间复杂度
O(n),其中 n 是过滤器的容量。
*示例
*基本用法(配合 CF.SCANDUMP)
> CF.RESERVE cf 8
OK
> CF.ADD cf item1
(integer) 1
> CF.SCANDUMP cf 0
1) (integer) 1
2) "\x01\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x01\x008\x9a\xe0\xd8\xc3\x7f\x00\x00"
> CF.SCANDUMP cf 1
1) (integer) 9
2) "\x00\x00\x00\x00\a\x00\x00\x00"
> CF.SCANDUMP cf 9
1) (integer) 0
2) (nil)
*恢复过滤器
> CF.LOADCHUNK cf_new 1 "\x01\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x01\x008\x9a\xe0\xd8\xc3\x7f\x00\x00"
OK
> CF.LOADCHUNK cf_new 9 "\x00\x00\x00\x00\a\x00\x00\x00"
OK
> CF.EXISTS cf_new item1
(integer) 1
*Python 完整示例
# 保存过滤器
chunks = []
iter = 0
while True:
iter, data = CF.SCANDUMP(key, iter)
if iter == 0:
break
else:
chunks.append([iter, data])
# 加载过滤器
for chunk in chunks:
iter, data = chunk
CF.LOADCHUNK(new_key, iter, data)
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 参数数量不足 | 确保提供 key、iterator 和 data 三个参数 |
| ERR invalid data | 数据格式错误或损坏 | 确认数据块完整且未被篡改,检查 iterator 与数据块是否匹配 |
| ERR item exists | 目标键已存在但不是 Cuckoo Filter 类型 | 使用不同的键名,或先删除现有键 |
*最佳实践
- 增量恢复:CF.LOADCHUNK 支持增量恢复,按 CF.SCANDUMP 输出的顺序依次调用即可完整重建过滤器
- 确保数据一致性:在恢复过程中,不要修改源过滤器(如果有的话),确保数据块与迭代器值正确对应
- 覆盖行为:CF.LOADCHUNK 会覆盖目标键的现有数据。如果目标键已有 Cuckoo Filter,会被完全替换
- 数据完整性:所有数据块和对应的迭代器值都必须完整加载,否则恢复后的过滤器可能不正确
- 大数据迁移:CF.SCANDUMP + CF.LOADCHUNK 是迁移大型 Cuckoo Filter 的推荐方式,因为标准的 DUMP/RESTORE 可能无法处理大数据结构
*FAQ
Q1: CF.LOADCHUNK 和 RESTORE 命令有什么区别? A: RESTORE 是 Redis 通用的键恢复命令,适合常规数据类型。对于大型 Cuckoo Filter,DUMP/RESTORE 可能因数据量过大而失败。CF.SCANDUMP + CF.LOADCHUNK 采用增量方式,将过滤器分成多个小块传输,更适合大型过滤器的备份和迁移。
Q2: 数据块必须按顺序加载吗? A: 是的,必须按照 CF.SCANDUMP 返回的顺序依次加载。每个数据块都依赖之前的状态,跳过或乱序加载会导致恢复失败或数据损坏。
Q3: 可以部分加载数据块吗? A: 不可以。必须加载所有数据块(直到迭代器返回 0)才能完整恢复过滤器。只加载部分数据块会导致过滤器不完整,查询结果可能不正确。
Q4: CF.LOADCHUNK 会覆盖已有的过滤器吗? A: 是的,CF.LOADCHUNK 会覆盖目标键。如果目标键已经存在(无论是 Cuckoo Filter 还是其他类型),都会被替换为恢复的数据。如果需要保留原有数据,请使用不同的键名。
Q5: 迭代器值和数据块如何对应? A: 每次 CF.SCANDUMP 返回一个 (iterator, data) 对。加载时,将 iterator 和 data 一起传给 CF.LOADCHUNK。下一次调用 CF.SCANDUMP 时,使用返回的 iterator 作为参数。iterator 值为 0 表示所有数据块已传输完毕。