缓存穿透
- 缓存穿透指的是查询一个一定不存在的数据,由于不存在这个值,导致每次查询都会取DB上查询。
- 解决方案:
- 缓冲一个空值
- 在查询之前按照一定规则过滤掉不符合规则的肯定不存在的值
- 使用布隆过滤器(BloomFilter),但是有一定的误判率,会将可能不存在的值误判为存在。如果判断为不存在,则不去查DB。
缓存雪崩
- 缓存雪崩指的是由于大量的key在相同的时间同时过期,导致大量的请求打到DB,导致DB压力过大
- 解决方案:
- 错开过期时间
- 查询数据库的时候限流(RateLimit,令牌桶算法)
- 加锁查库,先查cache,如果没有内容则获取锁查DB,然后释放锁,唤醒其他线程
热点数据击穿
- 一些热点数据失效之后,大量的并发查询打到DB,导致DB压力变大
- 解决方案:
- 加锁查库,先查cache,如果没有内容则获取所查DB,然后释放锁,唤醒其他线程
- 预判超时,缓存旧值(Guava Cache的RefreshAfterWrite)
- 预热,在系统启热点Key放在本地缓存动后先将热点数据加入到缓存
-
- 多级缓存
- 热点Key放在应用节点本地缓存
- 远程缓存定时从DB更新
网友评论