Skip to content

Commit

Permalink
[docs update]完善缓存穿透、击穿和雪崩解决方案
Browse files Browse the repository at this point in the history
  • Loading branch information
Snailclimb committed Apr 25, 2024
1 parent 9f3580a commit a37b875
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 12 deletions.
25 changes: 14 additions & 11 deletions docs/database/redis/redis-questions-02.md
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,10 @@ Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数

根据用户或者 IP 对接口进行限流,对于异常频繁的访问行为,还可以采取黑名单机制,例如将异常 IP 列入黑名单。

后面提到的缓存击穿和雪崩都可以配合接口限流来解决,毕竟这些问题的关键都是有很多请求落到了数据库上造成数据库压力过大。

限流的具体方案可以参考这篇文章:[服务限流详解](https://javaguide.cn/high-availability/limit-request.html)

### 缓存击穿

#### 什么是缓存击穿?
Expand All @@ -677,9 +681,9 @@ Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数

#### 有哪些解决办法?

1. 设置热点数据永不过期或者过期时间比较长。
2. 针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。
3. 请求数据库写数据到缓存之前,先获取互斥锁,保证只有一个请求会落到数据库上,减少数据库的压力
1. **永不过期**(不推荐):设置热点数据永不过期或者过期时间比较长。
2. **提前预热**(推荐):针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。
3. **加锁**(看情况):在缓存失效后,通过设置互斥锁确保只有一个请求去查询数据库并更新缓存

#### 缓存穿透和缓存击穿有什么区别?

Expand All @@ -705,17 +709,16 @@ Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数

**针对 Redis 服务不可用的情况:**

1. 采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。
2. 限流,避免同时处理大量的请求。
3. 多级缓存,例如本地缓存+Redis 缓存的组合,当 Redis 缓存出现问题时,还可以从本地缓存中获取到部分数据。
1. **Redis 集群**:采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。Redis Cluster 和 Redis Sentinel 是两种最常用的 Redis 集群实现方案,详细介绍可以参考:[Redis 集群详解(付费)](https://javaguide.cn/database/redis/redis-cluster.html)
2. **多级缓存**:设置多级缓存,例如本地缓存+Redis 缓存的二级缓存组合,当 Redis 缓存出现问题时,还可以从本地缓存中获取到部分数据。

**针对热点缓存失效的情况**
**针对大量缓存同时失效的情况**

1. 设置不同的失效时间比如随机设置缓存的失效时间
2. 缓存永不失效(不太推荐,实用性太差)
3. 缓存预热,也就是在程序启动后或运行过程中,主动将热点数据加载到缓存中
1. **设置随机失效时间**(可选):为缓存设置随机的失效时间,例如在固定过期时间的基础上加上一个随机值,这样可以避免大量缓存同时到期,从而减少缓存雪崩的风险
2. **提前预热**(推荐):针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期
3. **持久缓存策略**(看情况):虽然一般不推荐设置缓存永不过期,但对于某些关键性和变化不频繁的数据,可以考虑这种策略

**缓存预热如何实现?**
#### 缓存预热如何实现?

常见的缓存预热方式有两种:

Expand Down
2 changes: 1 addition & 1 deletion docs/java/jvm/jvm-garbage-collection.md
Original file line number Diff line number Diff line change
Expand Up @@ -464,7 +464,7 @@ JDK1.8 默认使用的是 Parallel Scavenge + Parallel Old,如果指定了-XX:
- **无法处理浮动垃圾;**
- **它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生。**
**CMS垃圾回收器在Java 9中已经被标记为过时(deprecated),并在Java 14中被移除**
**CMS 垃圾回收器在 Java 9 中已经被标记为过时(deprecated),并在 Java 14 中被移除**
### G1 收集器
Expand Down

0 comments on commit a37b875

Please sign in to comment.