redis 缓存预热_Redis缓存雪崩、缓存穿透、缓存并发,缓存预热

本文介绍了Redis缓存中常见的问题及其解决方案,包括缓存雪崩、缓存穿透和缓存并发。针对缓存雪崩,提出了使用高可用的Redis集群和本地缓存配合限流、熔断策略。对于缓存穿透,建议在数据库无数据时设置默认值并限制无效key。面对缓存并发,推荐使用分布式锁和消息队列进行串行化操作。最后讨论了缓存预热的方法,如手动预热页面和项目启动时自动加载数据。
摘要由CSDN通过智能技术生成

缓存雪崩

数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。

redis集群大面积故障,缓存失效,但依然大量请求访问缓存服务redis,redis大量失效后,大量请求转向到mysql数据库。

mysql的调用量暴增,很快就扛不住了,甚至直接宕机,由于大量的应用服务依赖mysql和redis的服务,这个时候很快会演变成各服务器集群的雪崩,最后网站彻底崩溃。、

解决思路

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

可以利用ehcache等本地缓存(暂时支持),但主要还是对源服务访问进行限流、资源隔离(熔断)、降级,其目的是保证当访问量剧增、服务出现问题仍然需要保证服务还是可用的。

Redis哨兵(Sentinel)模式

Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。

当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换

Redis集群(Cluster )模式

redis cluster是一个去中心化的集群,每个节点都会跟其他节点保持连接,用来交换彼此的信息。

redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉

缓存穿透

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

解决思路

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

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

缓存并发

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

解决思路

分布式锁加时间戳:用到的redis函数是setnx(),在set锁的同时加上保存一个时间戳。

消息队列:在并发量过大的情况下,可以通过消息中间件进行处理,把并行读写进行串行化,把Redis.set操作放在队列中使其串行化,必须的一个一个执行。

缓存预热

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

解决思路

直接写个缓存刷新页面,上线时人工维护。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值