*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: 通常可以,但建议在同版本或兼容版本间使用。模块版本差异可能导致二进制格式不兼容。