缓存穿透
什么是缓存穿透
查询一个不存在的数据,缓存层和数据层都不会命中
- 缓存穿透导致每次查询都要请求到储存层,失去了保护储存层的意义
- 大量的空值查询,因储存层不具备高并发,可能出现宕机。
形成原因:
- 自身业务代码问题
- 恶意攻击、爬虫
如何解决缓存穿透
- 缓存空对象
- 储存层未命中时,该对象返回给缓存层保留,再次访问直接访问缓存就能找到。保护了后端数据。
- 造成问题:
- 缓存里保留了大量了空值,造成缓存过大。解决方法:给保留的空值设置过期时间。
- 缓存和后端的数据不一致,需要消息队列或者其他方式清除空对象。
- 布隆过滤器
- 在访问缓存层和存储层之前,将存在的 key 用布隆过滤器提前保存起来(布隆过滤器的特点就是,如果布隆过滤器认为某个 key 不存在,那么这个 key 一定不存在,就不用再请求缓存和数据库了)