*Redis BF.SCANDUMP 命令
BF.SCANDUMP 开始或继续对 Bloom Filter 进行增量式序列化,用于备份或迁移。
*语法
BF.SCANDUMP key iterator
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Bloom Filter 的键名 |
| iterator | Integer | 是 | 迭代器值,首次调用传 0,后续传上次返回值 |
*返回值
返回一个包含两个元素的数组: - [0] Integer:下一次迭代器值,0 表示扫描结束 - [1] String:当前数据块(序列化二进制数据),最后一个 chunk 可能为空字符串
*时间复杂度
O(M),M 为返回的数据块大小。
*示例
*基本用法
> BF.RESERVE myfilter 0.01 1000
OK
> BF.ADD myfilter "item1"
(integer) 1
> BF.SCANDUMP myfilter 0
1) (integer) 1
2) "\x00\x01\x02..."
*完整扫描流程
> BF.SCANDUMP src 0
1) (integer) 5
2) "\x00\x01..."
> BF.SCANDUMP src 5
1) (integer) 10
2) "\x02\x03..."
> BF.SCANDUMP src 10
1) (integer) 0
2) ""
*空过滤器
> BF.RESERVE empty 0.01 100
OK
> BF.SCANDUMP empty 0
1) (integer) 0
2) ""
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR not found | key 不存在 | 确认 key 是否正确 |
| WRONGTYPE | key 不是 Bloom Filter 类型 | 确认 key 对应的数据结构 |
| ERR invalid iterator | 迭代器值无效 | 使用上次 SCANDUMP 返回的迭代器值 |
*最佳实践
- 必须按顺序使用 SCANDUMP 返回的迭代器值依次调用,直到返回 0
- SCANDUMP 在扫描期间不会阻塞 Redis,但大量数据可能影响性能
- 建议在从节点执行 SCANDUMP 避免影响主节点写入
- 序列化数据为二进制格式,传输时应注意编码(如使用 Redis 二进制协议)
*FAQ
Q1: SCANDUMP 会阻塞 Redis 吗? A: 不会。SCANDUMP 是增量式的,每次调用只返回一个数据块,不会长时间阻塞。
Q2: 扫描期间可以修改过滤器吗? A: 可以,但修改后的数据可能出现在后续 chunk 中。为保证一致性,建议在扫描期间暂停写入,或对快照执行。
Q3: SCANDUMP 的数据能用其他方式解析吗? A: 不建议。数据格式为 RedisBloom 模块内部二进制格式,应仅用于配套的 BF.LOADCHUNK 恢复。