mysql数据库击穿_缓存穿透、击穿、雪崩区别和解决方案

  • Post author:
  • Post category:mysql


自强学堂

文中的cache指缓存,比如redis,db指数据库,比如mysql。

一、缓存的三种模式

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

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

a)数据写入流程

6f1a8d305db2b2a9a62a576285272897.png

b)数据读取流程

7d13bf0629a1fdbcab9a002d22d76651.png

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

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

6352a1ea4dc8b8c5d17feebbfb69485d.png

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

bf6a25d261b0daf364fa990bd2431355.png

类似于 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 过期时间随机抖动下。



版权声明:本文为weixin_33643798原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。