缓存穿透、击穿、雪崩区别和解决方案

转自公众号:自强学堂
文中的cache指缓存,比如redis,db指数据库,比如mysql。

一、缓存的三种模式

这里主要指的是应用代码对 cache 和 db 中数据的维护方式。

1.1 应用代码同时更新 cache 和 db

a)数据写入流程

b)数据读取流程

1.2 应用代码只更新 cache,cache 负责同步更新 db

此时可以将 cache 和 db 看成一个整体,db 自己维护 cache。

1.3 应用方代码更新缓存,另外将 cache 中数据定期更新到 db


类似于 Linux 文件系统中的 page cache。
这个可能会导致数据不一致,甚至数据丢失。

二、缓存使用要注意的问题

当缓存使用不当时,可能会导致请求瞬间打到db,db 扛不住挂掉。
常见的有以下三种问题。

2.1 缓存穿透

概念说明:指 cache 和 db 中都没有数据,读完 cache 没有,再读 db 还是没有,每次请求到 cache 和 db。
解决方法:
a).拦截非法请求,比如不正常的 id 请求直接拒绝。
b).没有数据时也 cache 下,过期时间可设置短点,不把过多请求打到 db 去。
c).使用 Write Behind Caching 模式,命中不了 cache 不读取 db。这时需要注意 cache 大小,此时的数据都存在了内容。
d).采用布隆过滤器,不存在的 key 直接过滤;布隆过滤器判断存在,则数据可能存在,如果判断不存在,则肯定不存在。
一般建议前两种,实现起来比较简单

2.2 缓存击穿

概念说明:一般是少量热点数据过期(比如微博热搜),导致大量请求查 cache 没有,又查 db。
解决方法:
a)热点 key 永不过期,异步更新。
b)更新热点 key 时加锁,同一个 key 最好只有一个请求打到 db。
c)接口限流,熔断、降级

2.3 缓存雪崩

概念说明:大量 cache 数据同时过期,导致大量请求打到 db。
解决方法:
a).热点 key 永不过期,异步更新。
b).防止同时大量数据过期,cache 过期时间随机抖动下。

猜你喜欢

转载自www.cnblogs.com/wuyongqiang/p/12636803.html