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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值