redis专题十六:redis的常见几个解决方案

一、缓存预热

现象:服务器启动之后迅速宕机

分析:

  • 服务器刚启动时,缓存中是没有数据的,自然会给服务器带来一些压力,这个时候加上高请求过来,redis服务器可能就会宕机
  • 主从之间数据吞吐量比较大,因为不停的在加载数据,数据同步加载频度较高

解决:缓存预热:就是在系统启动前,提前将相关的缓存数据直接加载到缓存系统,避免用户在请求的时候,先查询数据库,然后再将数据缓存的问题,用户直接查询事先被预热的缓存数据。具体实施如下:

(1)前期准备工作

  • 日常例行统计数据访问记录,尤其高频热点数据
  • 如果数据量比较大,利用LRU数据删除策略,构建数据留存队列

(2)准备工作

  • 将统计结果数据分类,优先加载级别高的热点数据
  • 利用分布式多服务器同时读取,提高数据加载过程

(3)实施

  • 使用脚本程序固定触发数据预热过程
  • 如果条件允许,使用CDN(内容分发网络),效果更高

二、缓存雪崩

现象:系统平稳运行过程中,忽然数据库连接量激增,应用服务器无法及时处理请求,可能前端页面也会崩溃,数据库崩溃,紧接着应用服务器崩溃,redis集群崩溃,即使重启数据库等之后再次瞬间被流程放倒。

分析:

  • 在一个较短的时间内,缓存中较多的key集中过期;
  • 在此周期内访问过期的数据,redis未命中,只能向数据库获取数据
  • 数据库接收到大量请求之后没法及时处理
  • redis大量请求积压,开始出现超时现象
  • 数据库流量激增,数据库崩溃
  • 最后redis崩溃,集群瓦解,应用服务器随之崩溃

解决:

  • 更多页面静态化处理
  • 构建多级缓存架构,比方说Nginx缓存+redis缓存+ehcache缓存等
  • 检测mysql严重耗时业务优化:比方说超时查询,慢sql,耗时高的事务等
  • 灾难预警机制:监控redis服务器的性能指标,比方说CPU占用、内存容量等
  • 限流、降级:短时间内限制部分请求的访问,待恢复正常后再放开(这样可能会牺牲部分用户体验)

从另外一方面,针对过期这件事情,怎么解决呢?

  • 数据有效期策略调整:根据数据有效期进行分类错峰,比方说A类10分钟,B类20分钟,C类30分钟等;过期时间使用固定值+随机值的方式,稀释集中到期key的数量
  • 超热key使用永久key
  • 定期维护(夹带人工维护):对即将到期的key进行人工统计,确认是否需要延迟,配合统计量访问,做热点数据延迟
  • 部分场景,采用加锁(一般不推荐)

总结:缓存雪崩就是瞬间过期数据量太大,导致对数据库服务器造成压力。如能有效避免过期时间的集中,可以有效解决雪崩现象的出现;配合其他策略一起使用,并监控服务器的运行,根据运行记录做调整。

三、缓存击穿

现象:系统运行过程中,数据库访问激增崩溃,redis也无大量key过期,redis CPU正常

分析:

  • redis中某个key过期,该key访问量很大
  • 多个数据请求从服务器压到redis之后,均没有命中
  • redis短时间发起大量对数据库同一数据的访问

从上面看,大概是单个key过热,key过期

解决:这本质还是key过期的问题

  • 监控访问量,对自然流量激增的数据延长有效时间或者设置永久key
  • 后台刷新数据,启动定时任务,高峰期来临之前,刷新数据的有效期,确保不丢失
  • 设置二级缓存,设置不同的失效时间,保证不被同时淘汰
  • 加分布式锁,但是需要防止锁带来的性能瓶颈

总结:缓存击穿就是单个高热数据过期的瞬间,数据访问量较大,未命中redis,发起了大量对同一数据的数据库访问,导致对数据库服务器造成压力。应对的策略主要在业务数据分析和预防上进行,配合检测和及时调整策略,配合雪崩处理即可。

四、缓存穿透

现象:系统运行过程中,应用服务器流量增大,redis服务器命中率逐步降低,redis内存平稳无压力,但CPU占用激增,数据库压力激增最后崩溃

分析:

  • redis出现大面积未命中,出现非正常URL访问
  • redis获取的数据在数据库中也不存在,数据库查询也没有得到对应的数据
  • redis获得null数据没有进行持久化,直接返回,下次此数据达到时重复上述过程
  • 黑客攻击

解决:

  • 缓存null:对查询为null的数据进行缓存,设定短时间期限,定期清理
  • 白名单策略:提前预热各种分类数据id对应的bitmaps,相当于设置了白名单,当加载到正常数据时放行,加载异常数据时拦截(效率较低);使用布隆过滤器。
  • 实施监控:实时监控redis key的命中率,然后使用黑名单进行防控;
  • key加密:临时启动对传输过来的key进行加密,设定校验程序,如果key不满足规则,驳回数据访问;

总结:缓存击穿访问了不存在的数据,跳过了合法数据的redis数据缓存阶段,每次访问数据库,导致对数据库访问访问压力增大。出现此类情况,及时报警,及时处理。

 

这一篇就到这里了。

 

posted @ 2020-12-06 16:36  未知的九月  阅读(259)  评论(0)    收藏  举报