*Redis BF.LOADCHUNK 命令

BF.LOADCHUNK 从 BF.SCANDUMP 生成的数据块中恢复 Bloom Filter 的状态,用于增量式恢复或迁移。


*语法

BF.LOADCHUNK key iterator data

*参数说明

参数 类型 必填 说明
key String Bloom Filter 的键名
iterator Integer 数据块对应的迭代器值
data String / Bytes BF.SCANDUMP 返回的序列化数据块

*返回值

  • OK:数据块加载成功
  • Error:迭代器不匹配、数据损坏、key 已存在且类型不符等

*时间复杂度

O(M),M 为数据块大小。


*示例

*基本用法(配合 SCANDUMP 恢复)

> BF.RESERVE myfilter 0.01 1000
OK
> BF.ADD myfilter "item1"
(integer) 1
> BF.SCANDUMP myfilter 0
1) (integer) 1
2) "\x00..."
> BF.LOADCHUNK newfilter 1 "\x00..."
OK
> BF.EXISTS newfilter "item1"
(integer) 1

*完整增量恢复流程

> BF.SCANDUMP src 0
1) (integer) 5
2) "\x00\x01..."
> BF.LOADCHUNK dst 0 "\x00\x01..."
OK
> BF.SCANDUMP src 5
1) (integer) 10
2) "\x02\x03..."
> BF.LOADCHUNK dst 5 "\x02\x03..."
OK
> BF.SCANDUMP src 10
1) (integer) 0
2) ""

*常见错误

错误 原因 解决
ERR incompatible data 数据块与目标过滤器不兼容 确保迭代器值和 SCANDUMP 的返回对应
ERR iterator mismatch 迭代器值不匹配 使用 SCANDUMP 返回的迭代器值
WRONGTYPE key 已存在且不是 Bloom Filter 类型 使用新的 key 或先 DEL 旧 key

*最佳实践

  • 用于过滤器在实例间迁移或持久化到外部存储
  • 必须按迭代器值递增顺序依次调用 BF.LOADCHUNK,不可跳过或乱序
  • 最后一个 chunk 的迭代器为 0,表示扫描结束
  • 生产环境迁移前确认目标实例有足够内存容纳过滤器

*FAQ

Q1: BF.LOADCHUNK 可以覆盖已存在的过滤器吗? A: 可以,LOADCHUNK 会覆盖同名的 key。但建议先确认或 DEL 旧 key,防止意外覆盖。

Q2: 迭代器值为什么重要? A: 迭代器值用于保证数据块按正确顺序加载,确保内部状态一致性。错误的迭代器值会导致恢复失败或数据损坏。

Q3: SCANDUMP + LOADCHUNK 能否跨 Redis 版本使用? A: 通常可以,但建议在同版本或兼容版本间使用。模块版本差异可能导致二进制格式不兼容。