Skip to content

第五章 缓存相关概念 v1.0 ​

一、缓存示意图 ​

缓存示意图

二、缓存穿透 ​

缓存穿透是指查询缓存和数据库中都不存在的数据,导致每次查询都会绕过缓存直接访问数据库,最后返回空结果。

1.示意图 ​

缓存穿透示意图

2.解决方案 ​

a.缓存空对象 ​

将查询返回为空的数据也缓存起来。

优点:简单。

缺点:消耗内存,可能存在数据不一致的问题(缓存后数据库添加了新数据造成数据不一致)。

b.布隆过滤器 ​

使用布隆过滤器判断数据是否可能存在。

布隆过滤器误判率:数组越小误判率越大,但数组大可能带来更多的内存消耗。实现方案有 Redisson、Guava。

三、缓存击穿 ​

缓存击穿是指缓存中的某个热点数据过期,在该数据重新载入缓存之前,大量查询请求直接访问数据库。

1.示意图 ​

缓存击穿示意图

2.解决方案 ​

a.互斥锁 ​

优点:强一致性;没有额外性能消耗;实现较为简单。

缺点:线程需要等待,性能较差;可能有死锁风险。

互斥锁示意图

b.逻辑过期 ​

优点:高可用,性能优越。

缺点:不保证一致性;有额外内存消耗;实现较为困难。

逻辑过期示意图

四、缓存雪崩 ​

缓存雪崩是指大量 key 在同一时刻过期,或者 Redis 直接宕机,导致大量查询请求全部到达数据库。

1.示意图 ​

缓存雪崩示意图

2.解决方案 ​

a.key的过期时间添加随机值 ​

为 key 过期时间添加随机值以打散过期时间,使它们的失效点尽可能均匀分布。

b.高可用方案部署Redis ​

哨兵模式、集群模式。

c.降级限流 ​

Nginx 或 Spring Cloud Gateway。

d.多级缓存 ​

Guava 或 Caffeine。