Redis热点Key,雪崩,渗透,并发和解决方案

1,690 阅读3分钟

缓存雪崩

数据没有加载到缓存或者缓存存在大范围失效,导致所有请求都要访问数据库,导致数据库CPU和内存过载甚至导致数据库无法响应请求和系统崩溃。

缓存雪崩的过程

Redis集群大面积故障,但仍然有大量的请求访问缓存访问,由于缓存失败,大量的请求则转向数据库如MySQL,MySQL不能快速做出相应或者停止工作。由于大量的应用依赖MySQL和Redis,它将会导致服务器集群崩溃。最终应用(网站)将测底瘫痪。

解决方案

高可用缓存 Redis Sentinel和Redis Cluster 都是高可用的,以防止大量的缓存失败。即使,单独的节点甚至区域机房都关闭,仍然可以提供服务 。

Redis Sentinel除了提供高可用还提供其他附属任务,如监控,通知。 缓存降级 降级是保证核心服务可用,当访问量急剧增加并且分布式缓存不可用时,服务降级,访问本地缓存是主要的解决方案。系统可用预先设置好的关键数据进行自动降级或者通过配置开关实现手动降级,手动降级需要运维或者开发的配合。

例如,在推荐系统中,有很多个性化需求,如果个性化需求不能提供服 务,可 以通过降级来补充热门数据,以避免在前端页面产生大量的空白。

  服务降级方案,需要提前梳理哪些是核心业务必须保证正常服务,哪些业务可            以临时不提供服务,使用静态页面替换,还要评估服务器的核心指标以及设置后            整体方案。

Redis备份和快速预热 缓存渗透
缓存渗透是指在Redis中没有命中,则请求就会转发到MySQL数据进行查询。如果MySQL里面也没查询到数据就不好写缓存。这将导致不存在的数据每次请求都要查询数据库。

解决方案

如果数据库查询的数据为空,可以设置个默认的值存储到缓存中,以便第二次请求从缓存获取值而不继续访问数据库。需要对设置的默认值设置过期时间或者在数据库查询到的值时替换缓存的默认值。也可以为Key设置写规则,在查询前过滤不规则的Key。

缓存并发 多个Redis客户端同时设置Key的值导致的并发性问题。

解决方案

Redis是单线程的,具有epoll / kqueue,并且在I / O并发方面可以无限扩展。当然,另一个解决方案是序列化Redis。在队列中逐个设置操作

缓存预热 缓存预热是在系统联机后把相关的数据直接加载到缓存中,客户端请求直接查询在缓存的数据。避免先查询数据再写缓存的问题。

解决方案

在前端做刷新缓存的功能并在联机时手动操作;或者在系统启动时自动把数据加载到缓存,当数据量不大的的时候可以这样做。

如何加载大量数据集到Redis中,例如数十亿个键?Redis 2.6的版本后可以利用 pipe mode 。

微信公众号同步