Update 缓存.md

增加缓存三大典型问题--缓存穿透、缓存雪崩、缓存击穿的及其解决方案。
This commit is contained in:
HuaHero 2023-11-02 11:51:50 +08:00 committed by GitHub
parent b70121d377
commit bb9385ca61
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -86,24 +86,33 @@ CDN 主要有以下优点:
### 缓存穿透
指的是对某个一定不存在的数据进行请求,该请求将会穿透缓存到达数据库。
指的是对某个一定**不存在的**数据进行请求,该请求将会穿透缓存到达数据库(即数据**既不在缓存,也不在数据库**,例如特异构造的攻击数据)
解决方案:
- 对这些不存在的数据缓存一个空数据;
- 对这类请求进行过滤。
- 使用布隆过滤器(布隆过滤器--判断存在的不一定真存在,判断不存在的一定不存在;只支持增加操作,是一个位图)
### 缓存雪崩
指的是由于数据没有被加载到缓存中,或者缓存数据在同一时间大面积失效(过期),又或者缓存服务器宕机,导致大量的请求都到达数据库。
指的是由于****数据没有被加载到缓存中,或者缓存数据在同一时间大面积失效(过期),又或者缓存服务器宕机**,导致****大量的请求都到达数据库****
在有缓存的系统中,系统非常依赖于缓存,缓存分担了很大一部分的数据请求。当发生缓存雪崩时,数据库无法处理这么大的请求,导致数据库崩溃。
解决方案:
- 为了防止缓存在同一时间大面积过期导致的缓存雪崩,可以通过观察用户行为,合理设置缓存过期时间来实现;
- 为了防止缓存在同一时间大面积过期导致的缓存雪崩,可以通过观察用户行为,合理**设置缓存过期时间**来实现;
- 为了防止缓存服务器宕机出现的缓存雪崩,可以使用分布式缓存,分布式缓存中每一个节点只缓存部分的数据,当某个节点宕机时可以保证其它节点的缓存仍然可用。
- 也可以进行缓存预热,避免在系统刚启动不久由于还未将大量数据进行缓存而导致缓存雪崩。
- 也可以进行**缓存预热,避免在系统刚启动不久由于还未将大量数据进行缓存而导致缓存雪崩**。
### 缓存击穿
**热点数据缓存过期**。我们的业务通常会有几个数据会被频繁地访问,比如秒杀活动,这类被频地访问的数据被称为热点数据。
如果缓存中的某个热点数据过期了,此时大量的请求访问了该热点数据,就无法从缓存中读取,直接访问数据库,数据库很容易就被高并发的请求冲垮,这就是缓存击穿的问题。
解决方案:
- 互斥锁方案,保证同一时间只有一个业务线程更新缓存,未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。
- 不给热点数据设置过期时间,由后台异步更新缓存,或者在热点数据准备要过期前,提前通知后台线程更新缓存以及重新设置过期时间;
### 缓存一致性