缓存穿透、缓存击穿、缓存雪崩区别和解决方案

2021/3/21

# 缓存流程

# 缓存穿透

缓存穿透是指缓存和数据库中都没有数据,而用户不断地发起请求。

解决方案:

  1. 校验参数、用户身份;
  2. 不存在的数据设置空缓存;(浪费内存)
  3. 布隆算法(布隆过滤器)

哈希函数:将任意大小的数据转换成特定大小的数据的函数,转换后的数据称为哈希值或哈希编码。原始数据经过哈希函数的映射后称为了一个个的哈希编码,数据得到压缩。

哈希函数是实现哈希表和布隆过滤器的基础。

# 缓存击穿

缓存击穿是指缓存中没有但是数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读取缓存没读到数据,又同时去查数据库,造成数据库压力过大。缓存击穿是并发查询同一条数据。

解决方案:

  1. 设置热点数据永不过期;
  2. 定时任务刷新缓存时间;
  3. 加互斥锁/分布式锁,访问数据库。

# 缓存雪崩

缓存雪崩是指缓存中不同的数据在某一时刻突然失效,导致大量的请求打到数据库中。

引起原因:

  1. 缓存数据的有效期一致;
  2. Redis挂了;

解决方案:

  1. 设置热点数据永不过期;
  2. 缓存数据的有效期随机,防止同一时间大量数据过期现象发生;(缓存数据的有效期一致)
  3. 定时任务刷新缓存时间;
  4. 加互斥锁/分布式锁,访问数据库;
  5. Redis集群:切片集群模式(分布式,每个节点存部分数据)、副本集群模式(即主从/主备)。(Redis挂了)

# 参考资料

缓存穿透、缓存击穿、缓存雪崩区别和解决方案 (opens new window)

Redis缓存穿透的终极解决方案,手写布隆过滤器 (opens new window)

布隆过滤器(Bloom Filter)的原理和实现 (opens new window)