redis常见问题和解决方案

不想你离开。 提交于 2019-12-16 03:14:41

redis常见问题和解决方案

预热问题

  • 在启动redis的时候,因为热点数据未加载,导致服务器压力大,cpu增高,甚至崩溃

问题解析

  • 缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统,毕淼在用户请求的时候,先查询数据库,再将数据缓存的问题,用户直接查询事先被预热的缓存数据

解决方案

  • 前置准备工作
    • 日常例行统计数据访问记录,统计访问频度较高的热点数据
    • 利用LRU数据删除策略,构件数据留存队列
  • 准备工作
    • 将统计结果中的数据分类,根据级别,redis优先加载级别较高的热点数据
    • 利用分布式多服务器同时进行数据读取,提速数据加载过程
  • 实施
    • 使用脚本程序固定触发数据预热过程
    • 如果条件允许,使用CDN,效果会更好

雪崩

问题排查

  • 在一个较短的时间内,缓存中较多的key集中过期
  • 这周期内,请求访问过期的数据,redis未命中,redis向数据库获取数据
  • 数据库同时接受到大量的请求,无法及时处理
  • redis大量请求被积压.开始出现超时现象
  • 数据库流程激增,数据库崩溃
  • 重启后仍然面对缓存中无数据可用
  • reids服务器资源被严重占用,redis服务器崩溃
  • 应用服务器无法及时得到数据响应请求,来自客户端的请求数量越来越多,应用服务器崩溃
  • 应用服务器,redis,数据库全部重启,效果不理想

问题分析

  • 短时间范围内
  • 大量key集中过期

解决方案(外部优化)

  • 更多页面静态化处理
  • 构件多级缓存结构,nginx+redis+ehcache
  • 检测mysql严重耗时业务进行优化
  • 灾难预警机制
    • 监控redis服务器性能指标(cpu,内存容量,查询平均响应时间,线程数)
  • 限流,降级:短时间内牺牲一些客户体验,闲置一部分请求访问,降低应用服务器压力,待业务低速运转后逐步放开访问

解决方案(内部优化)

  • LRU和LFU切换
  • 数据有效期策略调整
    • 根据业务数据有效期进行分类错峰
    • 过期时间使用固定时间+随机数的形式,稀释集中到期的key的数量
  • 超热数据永久使用key
  • 定期维护:对即将过期数据做访问量分析,确认是否延时,配合访问量统计,做热点数据的延时
  • 加锁

总结

  • 缓存雪崩就是瞬间过期数据量过大,导致对数据服务器造成压力,如能有效避免过期时间集中,可以有效解决雪崩问题的出现,
    加上其他策略一起使用,监控服务器的运行数据,根据运行记录做调整

击穿

问题排查

  • 系统平稳运行过程中
  • 数据库连接梁瞬间激增
  • redis服务器无大量key过期
  • redis内存平稳,无波动
  • redis服务器cpu正常
  • 数据库崩溃

问题分析

  • 单个key高热数据
  • key过期

解决方案

  • 预先设定:在一些应用场景下,延长key的过期时间,购物节之类的
  • 现场调整:监控访问量,对自然流量递增的延长时间或设置成永久性key
  • 后台刷新数据:启动定时任务,高峰期来临之前,刷新有效数据,确保不丢失
  • 二级缓存:设置不同的失效时间,保障不会被同时淘汰
  • 加锁:分布式锁,防止被击穿

总结

  • 缓存击穿就是单个高热数据过期瞬间,数据访问量大,未命中redis后,发起的大量对同一数据的数据库访问,导致
    对数据库服务器造成压力,应对策略应该在业务数据分析与预防方面进行,配合运行监控测试和即时调整策略,
    毕竟单个key的过期监控难度较高,配合雪崩处理策略即可.

问题排查

  • redis大面积出现未命中
  • 出现非正常url访问

问题分析

  • 获取的数据在数据库中也不存在,数据查询尾的大对应数据
  • redis获取到null数据未进行持久化,直接返回
  • 下次此类数据到达重复上述过程
  • 出现黑客攻击服务器

解决方案

  • 缓存null:对查询结果为null的数据进行缓存,设定短时限,例如30-60s,最高5分钟
  • 白名单策略
    • 提前预热各种分类数据id对应的bitmaps,id作为bitmaps的offset,相当于设置数据白名单,加载正常数据,就放行
      ,异常数据就拦截
    • 使用布隆过滤器
  • 实施监控
  • key加密:问题出现后,临时启动防灾业务key,对key进行业务层传输加密服务,设定校验程序,过来的key校验.

总结

  • 缓存击穿访问了不存在的数据,跳过了合法数据的rendis数据缓存阶段,每次都访问数据库,导致对数据服务器造成压力,
    数据的出现量是一个较低的值,当出现此类情况以毒攻毒,及时报警,
  • 白名单和黑名单,对整体系统的压力都有,警报解除后尽快移除
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!