Appearance
Redis 布隆过滤器怎么用:缓存穿透为什么常和它一起出现
很多系统在讲缓存穿透时,几乎都会提到:
- 布隆过滤器
但如果不把它的定位和边界想清楚,很容易出现两种误解:
- 觉得它可以替代数据库校验
- 觉得它是缓存穿透的万能解法
先说结论
布隆过滤器最适合解决的是:
- 大量查询本来就不存在的数据
它的价值在于:
- 快速判断“某个元素大概率不存在”
但它有一个非常关键的边界:
- 可能误判存在
- 但不会把真实存在的数据误判成不存在
一、为什么缓存穿透会引出布隆过滤器
缓存穿透的典型问题是:
- 某个 key 根本不存在
- 缓存没有
- 数据库也没有
- 但请求还在不断打进来
这样数据库就会被很多无效请求拖住。
布隆过滤器的作用就是:
- 在真正查缓存和数据库前,再做一次“存在性前置判断”
二、它到底在做什么
可以先粗略理解成:
- 用很小的空间,记录一批“可能存在”的元素集合特征
当一个元素来时:
- 如果判断一定不存在,就可以直接拦掉
- 如果判断可能存在,再继续查缓存或数据库
三、为什么说它适合“拦不存在”,不适合“确认存在”
因为它的设计特点是:
- 可以误判存在
- 但不会漏掉真的存在项
所以它特别适合做:
- 负向过滤
而不是当作最终权威结果。
四、什么时候值得上布隆过滤器
比较适合:
- key 数量大
- 穿透请求明显
- 不存在查询很多
例如:
- 商品 id 猜测攻击
- 用户 id 乱扫
- 接口被恶意探测
五、和“缓存空值”怎么配合
很多系统里,真正更稳妥的做法不是二选一,而是:
- 布隆过滤器
- 缓存空值
配合使用。
可以理解成:
- 布隆过滤器先挡大部分无意义请求
- 少数漏过去但数据库确实没有的数据,再用空值缓存兜一层
六、几个容易踩的坑
1. 以为布隆过滤器结果就是最终真相
不是,它更像前置筛选。
2. 忽略数据更新
如果业务主数据不断新增,过滤器本身也要跟着维护。
3. 用它处理所有缓存问题
它主要针对的是:
- 穿透
不是击穿、雪崩的通用解法。
一句话总结
布隆过滤器最适合做的,是在缓存和数据库之前,先把“大量肯定不存在”的请求挡掉。
它是缓存穿透治理里很好的一层,但不是替代缓存和数据库的最终判定器。