*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 恢复。