目录
转自公众号:自强学堂
文中的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 过期时间随机抖动下。