第五章 缓存相关概念 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。