缓存穿透,缓存击穿,缓存雪崩解决方案学习

文章目录

  • 前言:基本多级缓存架构
  • 一、缓存穿透
    • 1.1 缓存穿透介绍
    • 1.2 缓存穿透图例
    • 1.3 解决方案
      • 1.3.1 使用 Redis 解决(解决方案图例,·多级缓存架构·)
      • 1.3.2 布隆过滤器
  • 二、 缓存击穿
    • 1.1 缓存击穿介绍
    • 1.2 缓存击穿图例
    • 1.3 缓存击穿解决方案
  • 三、缓存雪崩(热点数据集中失效)
    • 1.1 缓存雪崩介绍
    • 1.2 缓存雪崩图例
    • 1.2 缓存雪崩解决方案
  • 结尾:多级缓存架构优化方案

前言:基本多级缓存架构

内存缓存是否存在Key?
存在Key,返回Result
不存在Key
Key存在,返回Result
Key存在,MemoryCache 插入Key_value
Key不存在,数据库中查询
返回Result
Result存在,Redis 中插入Key_value
前端请求-查询Key
后端服务
MemoryCache
Redis
DataBase

一、缓存穿透

1.1 缓存穿透介绍

     缓存穿透指的是查询一个系统中根本不存在的数据,因为数据不存在则不会写入缓存,所以在查询的时候会越过缓存,查询请求直接抵达数据库。这样会导致有人恶意制造大量不存在的数据,请求我们系统,导致数据库压力过大崩溃。		

1.2 缓存穿透图例

如下图所示 因为我们设计的多级缓存,是不缓存不存在的数据的,导致查询大量不存在的数据时,请求全部涌入数据库,导致数据库挂调。
MemoryCache不存在Key,
Redis不存在Key,数据库中查询
返回Result
前端请求-不存在的Key
MemoryCache
Redis
DataBase

1.3 解决方案

1.3.1 使用 Redis 解决(解决方案图例,·多级缓存架构·)

Redis 缓存不存在的数据
内存缓存是否存在Key?
存在Key,返回Result
不存在Key
Key存在,返回Result
Key存在,MemoryCache 插入Key_value
Key不存在,数据库中查询
返回Result
Result存在,Redis 中插入Key_value
Result不存在,Redis 中插入Key_null,
设置过期时间,过期时间可以设置较短时间
前端请求-查询Key
后端服务
MemoryCache
Redis
DataBase

1.3.2 布隆过滤器

博主还未仔细研究这个如果和使用 后续研究会更新

二、 缓存击穿

1.1 缓存击穿介绍

 	缓存击穿两种场景:1. 场景1  因为我们使用Redis 时一般都会设置缓存超时时间,当某个缓存刚好过期,这个时候针对于某个Key ,前端突然涌入大量的请求时,不会命中缓存,因此请求瞬间涌入数据库,导致数据库崩溃。
					 2. 场景2  一般Redis 不会缓存数据库的全量数据,主要缓存一些热点数据(查询次数多的),比如央视突然放了一个广告,某个商品瞬间爆火,在这个之前这个商品是无人问津的,因此缓存中压根不存在该商品数据。因为爆火的原因,在这个一时刻,很多人同时去搜索这个商品,由于缓存灭有该数据,不会命中缓存,因此请求瞬间涌入数据库,导致数据库崩溃

1.2 缓存击穿图例

		图就不画了,可以对比上方缓存穿透,本质就是数据大,并且没有命中缓存导致的数据库压力多大崩溃。

1.3 缓存击穿解决方案

		 使用互斥锁去处理或则分布式锁。
内存缓存是否存在Key?
存在Key,返回Result
不存在Key
Key存在,返回Result
Key存在,MemoryCache 插入Key_value
Key不存在
成功查询数据库
失败,再次获取缓存中的数据
返回Result
Result存在,Redis 中插入Key_value
前端请求-查询Key
后端服务
MemoryCache
Redis
GetLock
DataBase

三、缓存雪崩(热点数据集中失效)

1.1 缓存雪崩介绍

      缓存雪崩是指在我们设置缓存时,大量的缓存数据采用了相同的过期时间,导致缓存在某一时刻同时失效,前端请求这些数据时,不会命中缓存,因此请求瞬间涌入数据库,导致数据库崩溃。

1.2 缓存雪崩图例

		图就不画了,可以对比上方缓存穿透,本质就是数据大,并且没有命中缓存导致的数据库压力多大崩溃。

1.2 缓存雪崩解决方案

	设置缓存时,在过期时间上加个随机过期时间例如1-5分钟,这样可以保证缓存不会在同一时刻大量失效,导致数据库压力过大。

结尾:多级缓存架构优化方案

内存缓存是否存在Key?
存在Key,返回Result
设置缓存过期时间+随机时间,
解决缓存雪崩问题
不存在Key
Key存在,返回Result
Key存在,MemoryCache 插入Key_value
Key不存在
获取锁失败,重新加载缓存,
解决缓存击穿问题
获取锁成功
Resul不存在,Redis 中插入Key_null
并设置一个较短的过期时间
解决缓存穿透问题
Result存在,Redis 中插入Key_value
返回Result
前端请求-查询Key
后端服务
MemoryCache
加载缓存
Redis
GetLock
DataBase

你可能感兴趣的:(微服务架构,Redis,microsoft,redis,缓存)