如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题

缓存雪崩

数据未加载到缓存中,或者同一时间大面积的缓存失效,导致所有请求全部查数据库,导致数据库cpu、内存负载过高或者直接宕机。

简单的雪崩过程:

1.redis集群大面积故障

2.缓存失效,依然有大量请求访问redis

3.redis大量失效后,大量请求直接转向到数据库

4.数据库的调用量暴增,很快就扛不住,甚至直接宕机

5由于大量的应用服务依赖redis和数据库的服务,这个时候就会演变成各个服务器集群雪崩,最后网站彻底崩溃。

如何预防缓存雪崩

1.缓存的高可用

缓存层设计城高可用,防止缓存大面积故障。即使个别节点、机器、甚至是机房宕机,依然可以提供服务,例如Redis Sentinel 和 Redis Cluster都实现了高可用。

2.缓存降级

可以利用ehcache等本地缓存暂时支持,但主要还是对源服务访问进行限流,资源隔离(熔断)、降级等。

当访问量剧增、服务出现问题任然需要需要保证服务器还是可用的,系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。

降级的最终目的还是保障核心服务高可用,即使是有损的。

比如推荐服务中,很多都是个性化的需求,如果个性化需求不能保证服务,那么可以降级补充点热点数据,不至于造成前端页面大片空白。

在进行降级钱要对系统进行梳理,比如:那些是核心的服务必须要保障,那些业务允许暂时的不提供服务,就可以利用静态页面暂时替换。以及配合服务器核心指标,然后设置整体预案。

1.一般:一些服务因为网络抖动或者服务正在上线而超时,可以自动降级

2.警告:有些服务在一段时间内成功率有波动(95%-100%),可以自动降级或人工降级,并发送警告

3.错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然增加到系统能承受的最大阀值,此时可根据情况自动降级或者人工降级。

Redis快速备份和预热

1.Redis数据备份和恢复

2.快速缓存预热

提前预练

项目上线前,提前演练缓存层宕掉后,应用以及后端的负载情况,以及可能出现的问题。对高可用提前演练,提前发现问题。

缓存穿透

缓存穿透是指查询一个不存在的数据,在Redis中没有命中,就需要从数据库中查询,查不到的数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中查询,造成缓存穿透。

解决思路:

如果查询数据库也为空,直接设置一个默认值存放到缓存中,这样第二次到缓存中获取就有值了,而不会继续访问数据库,设置一个过期时间或者当有值的时候将缓存中的值替换掉即可。

可以给key设置一些格式规则,然后查询前先过滤掉不符合规则的key

缓存并发

这里的并发指的是多个client端同时set key 引起的并发问题,其实redis自身就是单线程操作,多个client并发操作,按照先到先执行的原则,先到的先执行,其余的阻塞。另外的解决方案是把redis的set操作放到队列中使其串行化,必须一个一个执行。

缓存预热

缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统,这样就可以避免在系统用户请求时,先查询数据库,然后再将数据缓存的问题,用户直接查询事先被缓存的数据。

1.直接写个缓存刷新页面,上线时手工刷新一下

2数据量不大可以在项目启动的时候自动进行加载

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值