一、缓存穿透概述
为了提高响应时间,服务架构上,在db存储层上,通常会有缓存层。
缓存穿透是指:
1.缓存不命中
2.存储层不命中,不将空结果写缓存
3.返回空结果
缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去缓存保护后端的意义。
二、缓存穿透原因
1.自身业务代码或者数据出现问题
2.恶意攻击造成的
三、解决方案
1.缓存空对象
不命中后,把改key的value置为空,缓存下来
问题:
(1)这种方式如果恶意攻击的话,会大量快速消耗内存,导致更严重的问题。
所以需要对value是空的key,设置一个过期时间。
(2)设置空对象,有可能造成短时间的数据不一致性,比如存储层新加了一个用户的数据,
这时需要使用消息队列或者别的方式,主动更新下缓存。
2.使用布隆过滤器
就是在缓存层前面加一个布隆过滤器实现的。
比如推荐系统,维护一个用户组成的布隆过滤器。
有点是使用的内存小,缺点是增加代码开发维护难度。
开源社区上有很多实现方案,比如redis的bitmap数据结构就可以实现。