数据库与缓存常见问题与解决方法整理

一、缓存雪崩、击穿、穿透及解决方案
1、缓存雪崩,出现过程,假如一个系统,高峰期5000次/s,4000次走了缓存,1000次走数据库,数据库1000/s是正常指标,完全可以工作,但是如果缓存宕机了,或者缓存设置了相同的过期时间,导致缓存同一时间失效,然后5000次请求都打在了数据库上,数据库立马被打死了,数据库一般1s最多抗2000个请求(这个取决于具体硬件配置),如果DBA重启数据库,同样的立马会继续被打死,这就是缓存雪崩。
腾讯云数据库测试参数与结果:


缓存雪崩解决方案:
(1)、事前:redis高可用,主从+哨兵,redis cluster,避免单机崩溃
(2)、事中:hystrix限流&降级,避免mysql被打死,Ehcache缓存管理框架
(3)、事后:redis持久化RDB+AOF,快速恢复缓存数据
(4)、缓存的失效时间设置为随机值,避免同时失效

2、缓存穿透,出现过程,顾名思义透过缓存,比如我们的id为正数,但是黑客用id为负数的值请求则5000个请求全部穿透到数据库,数据库被打死。
解决方案:
(1)对请求参数进行校验,不合理直接返回
(2)查询不到的数据也放到缓存,value为空,如 set -999 “”,说实话这种不太常用,因为还涉及到缓存的清空策略比如LUR算法,导致正常缓存数据被移除,同样穿透数据库
(3)使用布隆过滤器,快速判断key是否在数据库中存在,不存在直接返回,直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中。和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一个标志,用来判断key是否在集合中。

3、缓存击穿,多条热点数据设置了相同的过期时间,导致同一时间,多个请求高并发访问数据库,如果数据量过大打死数据库,缓存雪崩是指大量缓存失效,缓存击穿是指热点数据库缓存失效。
解决方案:前提是这个都是针对比较相同的热点数据
(1)设置key永远不过期,或者快过期时,通过另一个异步线程重新设置key
(2)当从缓存拿到的数据为null,重新从数据库加载数据的过程上锁,下面写个分布式锁实现的demo
https://blog.csdn.net/zzti_erlie/article/details/104655455

二、数据库与缓存同步方式与优劣势分析,三种策略及分析

1.先更新数据库,再更新缓存
一方面,假如有a、b两个更新线程a更新数据库b更新数据库b更新缓存a更新缓存,b穿插在a线程的中间更改了同一条数据就会出现脏数据的情况;另一方面,如果数据操作时写多读少,而且缓存还是经过计算再写入,这样既计算缓存浪费资源同时多写少读不会查询,缓存也没意义。所以这种方案一般不采用,因此也不讨论解决

2.先删除缓存,再更新数据库
高并发下,先a更新、b读取两个线程,a删除缓存,b删除发现没有,b读取数据库旧值写入,a写入数据库。这样仍旧存在并发问题。甚至主从情况下把备数据库又写入了缓存。当然第一种策略的ab两个线程问题也同样存在。不过这种避免了第一种策略的浪费情况。这种的方式可以采用 “延时双删策略” 来处理

3.先更新数据库,再删除缓存
(1) 缓存刚好失效 (2) A查数据库得到一个旧值(3) B将新值写入数据(4) B删除缓存(5) A将旧值写入缓存。因为数据库的读比写快,所以这种概率比较低正常顺序应该是1 2 5 3 4,但是也是有可能发生的,也可能是查询出来值后,经过一系列计算,又写入缓存的。解决办法还是延时缓存双删,但是和策略2一样,删除失败了怎么办?

4、解决延时双删问题:
1.更新数据库  2.删除缓存失败  3.将要删除的key发送到消息队列  4.消费消息删除key,重试直到成功
解决任何不同步问题,最终策略都是要设置缓存存活时间,防止脏数据永远存留,这个很重要!!!
 

三、一级缓存与二级缓存

1、什么是一级缓存与二级缓存:https://blog.csdn.net/a2940093904/article/details/89247142

2、https://blog.csdn.net/mlym521/article/details/81914007?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-4&spm=1001.2101.3001.4242

参考:
https://blog.csdn.net/u012326462/article/details/81415522?utm_source=blogxgwz5
https://blog.csdn.net/zzti_erlie/article/details/104655455
https://baijiahao.baidu.com/s?id=1654694618189745916&wfr=spider&for=pc

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值