Redis项目总结–缓存穿透、缓存雪崩、缓存击穿目录

  • Redis项目总结–缓存穿透、缓存雪崩、缓存击穿
    • 一.缓存穿透
      • 1.什么是缓存穿透
      • 2.缓存穿透解决方案
      • 3.流程
    • 二.缓存雪崩
      • 1.什么是缓存雪崩
      • 2.解决方案
    • 三.缓存击穿
      • 1.什么是缓存击穿
      • 2.解决方案
      • 3.流程

一.缓存穿透1.什么是缓存穿透

查询某个 Key 对应的数据,Redis 缓存中没有相应的数据,则直接到数据库中查询。数据库中也不存在要查询的数据,则数据库会返回空,而 Redis 也不会缓存这个空结果。这就造成每次通过这样的 Key 去查询数据都会直接到数据库中查询,Redis 不会缓存空结果。这就造成了缓存穿透的问题,给数据库带来压力。

2.缓存穿透解决方案

方案一:缓存空对象,对不存在的key也将空对象进行缓存,并设置过期时间。

  • 优点:实现简单,维护方便。
  • 缺点:额外的内存消耗,缓存了无用key。可能导致短期的不一致。

方案二:布隆过滤,布隆过滤器可以针对大数据量的、有规律的键值进行处理。一条记录是不是存在,本质上是一个 Bool 值,只需要使用 1bit 就可以存储。我们可以使用布隆过滤器将这种表示是、否等操作,压缩到一个数据结构中。用户查询时,先询问过滤器,存在则查询redis,不存在则直接返回。

  • 优点:内存占用少,没有多余key。
  • 缺点:实现复杂。存在误判可能。

3.流程

原本流程:

使用方案一解决缓存穿透的流程:

二.缓存雪崩1.什么是缓存雪崩

同一段时间大量缓存key同时失效(同时到期)或redis宕机导致大量请求到达数据库,带来巨大压力。

2.解决方案

方案一:给不同的key的过期时间添加随机值,使不同key的过期时间分布在一个时间段之间。

方案二:利用redis集群提高服务可用性

方案三:给缓存业务添加降级限流策略

方案四:给业务添加多级缓存

三.缓存击穿1.什么是缓存击穿

缓存击穿问题也叫热点key问题,就是一个被高并发访问且缓存重建业务又比较复杂的的key突然失效,无数的请求访问会在瞬间给数据库带来巨大的冲击。

2.解决方案

方案一:互斥锁,加锁后只有第一个获取到锁的人才能继续去数据库查询,重建缓存,未获取锁的人不能执行该步骤,只能等待一会再次查询缓存。

  • 优点:没有额外内存消耗。保证了一致性。实现简单。
  • 缺点:线程需要等待,性能受影响。有死锁风险。

方案二:逻辑过期,热点key一般是参与秒杀活动的热门商品,可以将其设置为永不过期而给一个逻辑过期时间,事后手动删除,查询缓存发现逻辑过期时,返回过期的数据,若他是第一个获取到锁的人开启新线程去查询数据库,重建缓存,重置逻辑过期时间,其他人若在此期间访问则返回已过期的数据。

  • 优点:线程无需等待,性能较好。
  • 缺点:不保证一致性。有额外内存消耗。实现复杂。

3.流程

互斥锁:

逻辑过期: