Skip to content

缓存问题

缓存穿透

问题

查询一个不存在的数据,缓存没有,数据库也没有,每次都直接打DB。

解决

  1. 布隆过滤器

    布隆过滤器判断key是否存在
    存在才查缓存/数据库
  2. 空值缓存

    查询结果为空,缓存一个空值
    设置短TTL(如1分钟)
  3. 参数校验

    过滤非法参数

缓存击穿

问题

热点key过期瞬间,大量请求直接打DB。

解决

  1. 互斥锁

    只允许一个线程重建缓存
    其他线程等待
  2. 不过期

    不设置TTL,定期异步更新
  3. 逻辑过期

    设置过期时间戳
    发现过期,返回旧数据,同时异步更新

缓存雪崩

问题

大量key同时过期,请求直接打DB。

解决

  1. 随机TTL

    过期时间 = base + random(0, 3600)
  2. 多级缓存

    本地缓存 + Redis缓存
  3. 高可用

    Redis Cluster

面试考点

Q: 三者区别?

问题原因解决
穿透查询不存在的数据布隆过滤器、空值缓存
击穿热点key过期互斥锁、不过期
雪崩大量key同时过期随机TTL、多级缓存

最后更新: