redis缓存击穿, 缓存穿透和缓存雪崩解决方案

一、缓存击穿

1.什么是缓存击穿

缓存击穿也就是说当redis缓存中有一个key是大量请求同时访问的热点数据,如果突然这个key时间到了,那么大量的请求在缓存中获取不到该key,穿过缓存直接来到数据库导致数据库崩溃,这样因为单个key失效而穿过缓存到数据库称为缓存击穿。


2.怎么办,怎么解决

最简单粗暴的解决方案就是让热点key不设置过期时间,即key一直存在于缓存中,更新时直接覆盖即可。

设置定时任务检测要过期的key,然后在将要过期的时候重新从数据库把数据刷新到缓存中,这样的方式增加系统复杂度,并且实现复杂。

使用互斥锁的方案,在缓存中没有数据去数据库查询时加上锁,让一个线程去查询数据库以及更新缓存,其他线程等待,这样减小数据库压力。

二、缓存雪崩

1.什么是缓存雪崩

为了使查询速度更快,我们选择使用缓存来保存数据,使原本每次请求都需要查询数据库的操作变成先查询缓存,缓存有直接返回,缓存没有则查询数据库然后再写入缓存中,通常缓存都是有有效时长的,否则就会一直占用内存空间。


当大量请求在访问都会先从缓存查询,如果此时大部分缓存同时过期失效,那么这些请求都查询不到缓存,此时他们会全部将请求到数据库,当请求数量足够大时此时将会把数据库压垮,这就是缓存雪崩。比如在凌晨十二点搞促销,大约有10000个用户发起请求,此时缓存过期,则这10000个请求直接打到数据库上,把数据库压垮,即使重启数据库请求依然会打到数据库上。

2.怎么办,怎么解决

不设置过期时间,缓存更新直接刷新。

过期时间上加随机值,避免缓存集中过期。

使用集群将数据均匀分布在机器上。

采取一定的限流降级机制,防止大量请求搞垮数据库。

三、缓存穿透

1.什么是缓存穿透

指当请求查询缓存和数据库都不存在的数据时,先查询缓存为空,再查询数据库依然为空,向请求返回空,如果大量请求同时访问这些不存在key那么这些请求依然会造成压垮数据库的现象,这种通常是恶意查询和被攻击几率较大。


同样的请求一直出现,会造成压垮数据库的现象。

2.怎么办,怎么解决

缓存中存放查询的key,值设置为空,这样就能避免请求打到数据库,但是这样就会占用缓存空间。

在请求接口处做检查,如用户鉴权、参数校验等,对于不合法的请求直接返回,这样能够拦截部分不合法的请求。

使用布隆过滤器。

总结

缓存雪崩、缓存击穿、缓存穿透是生产和面试中常见的问题,在请求量小的时候这些问题造成的影响不大,但是一旦访问量大起来这些问题将会造成服务器宕机,甚至在重启服务器之后依然会扛不住压力继续宕机,只有提前为数据做好分析准备,选用合适方案进行解决才能够尽可能的减小生产服务器损失。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值