*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 表示所有数据块已传输完毕。