布隆过滤器在 redis 中不会被 lru/lfu 误淘汰,因其是 redisbloom 模块注册的自定义类型(robj_encoding_bloom),不参与 maxmemory-policy 管理;失效主因是容量预估不足、手动删除或位数组超限崩溃。

布隆过滤器在 Redis 中不会被 LRU/LFU 误淘汰——它根本不在 Redis 的淘汰策略管辖范围内。
BF.RESERVE 创建的 key 不参与内存淘汰
Redis 的 maxmemory-policy(如 allkeys-lru、volatile-lfu)只作用于标准数据类型(string、hash、set 等),而布隆过滤器是 RedisBloom 模块注册的自定义数据类型,底层是 ROBJ_ENCODING_BLOOM。Redis 内存淘汰逻辑压根不识别它,也就不会主动驱逐。
常见误解来源:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 看到
INFO memory里used_memory_dataset上涨,误以为它会像普通 key 一样被扫 - 观察到 OOM 时 Redis 主动 kill 进程,归因成“布隆过滤器被误删”,其实是系统级内存不足触发了
oom_killer
真正导致“失效”的是位数组膨胀 + 手动 DEL 或崩溃
布隆过滤器变大后出问题,通常不是被 Redis 淘汰,而是以下真实路径:
-
BF.RESERVE初始化时capacity设太小,后续插入超载 →items/capacity > 0.8→ 误判率飙升至 5%+,业务感知为“突然不准” - 人为执行
DEL my_bf_key清理“大 key”,没同步重建或补数据 → 过滤器消失,缓存穿透重现 - 单个布隆过滤器位数组突破 512MB(Redis 单 key 大小硬限制),写入失败或引发
redis-server进程卡死/崩溃 - 未启用
redis-bloom的自动扩容(如用BF.ADD而非BF.MADD),旧位图残留 + 新位图叠加,内存虚高且逻辑错乱
防范大内存下功能退化,关键在初始化和监控
与其担心“误淘汰”,不如盯住这三个动作:
- 算 capacity 时别信日均量:取最近 7 天
cache miss key的峰值 × 1.5,例如峰值 90 万 →BF.RESERVE my_bf 0.01 1350000 - 上线后每天定时跑
BF.INFO my_bf,重点看items和capacity比值;一旦 ≥ 0.8,立刻安排重建(先DEL,再BF.RESERVE,最后批量重灌) - 禁止对生产布隆过滤器做
DEBUG OBJECT或MEMORY USAGE—— 这些命令会阻塞主线程,大 key 下可能直接拖垮实例
布隆过滤器的“大”不是靠淘汰来缓解的,它需要的是前置容量预估、运行中比例监控、以及确定性重建流程。任何指望 Redis 自动帮你 shrink 或 drop 它的想法,都会在某次 BF.INFO 返回 items: 1248932, capacity: 1200000 时落空。










