Redis经典问题与方案

308 阅读2分钟

1、缓存穿透

访问了数据库不存在的数据

  1. 缓存设置空值失效时间短一点
  2. 用一个公用的服务记录不存在的key。判断一次是否是非法key
  3. 使用布隆过滤器,(原理是使用 bit 数组,给key用多个hash算法记录是否为1)

2、缓存雪崩

缓存大量不可用,全部打到db。拖垮数据库

  1. 对db请求增加开关,发现请求变慢、阻塞、慢请求超过阈值时关闭开关部门直接返回失败
  2. 对缓存数据增加多个副本、失败后查其它副本
  3. 集群监控、告警,停止非核心功能,保证核心功能

3、数据不一致

数据库与缓存数据不一致,其实是分布式系统的矛盾点AP与CP的选择,下面说说通用的做法

  1. 缓存更新失败后,重试机制,重试失败后写入错误记录表,待缓存修复在更新缓存
  2. 缓存时间适当调短,重新加载数据,确保最终一致
  3. 监听从库binLog后删除缓存,与代码解耦。

4、数据并发竞争

大量请求访问并发访问相同数据(缓存key失效或第一次访问),最终导致DB压力剧增

  1. 互斥锁
  2. 缓存数据多个备份
  3. 缓存预热

5、热key

大量请求访问同一个key(十万百万),打到一台缓存节点上,这时网卡,带宽,cpu很容易突破极限

  1. 识别热key,可以通过离线数据分析最近高频率的key
  2. 然后把key分散到不同节点上
  3. 服务端还可以使用本地缓存,将热key缓存减少对远程缓存的冲击

6、大key

缓存中key的value很大,频繁访问占带宽很容易产生慢查,拖垮缓存集群

  1. 减少大key
  2. 拆成多个key