1. 什么是缓存穿透?
key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。
比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
2. 解决方案
1. bloom布隆过滤器
- 相当于一个hashset,用来判断某个元素(key)是否在某个集合中。
- 将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力
关于布隆过滤器,详情参阅:https://www.cnblogs.com/liyulong1982/p/6013002.html
为了解决bloom不能删除元素的问题,出现了Cuckoo 布谷鸟过滤器,详情参阅:https://cloud.tencent.com/developer/article/1447177
2. 使用空的缓存
如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟
3. 数据发生穿透后怎么办?
- client增加redis中的key value标记
- 数据库增加元素后要完成元素对bloom的添加