缓存常见问题

1.缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

解决方案

  • 缓存空对象

    • 优点:实现简单,维护方便
    • 缺点:
      • 额外的内存消耗
      • 可能造成短期的不一致

    如果使用id为key缓存空对象,那使用uuid作为id访问,也会造成大量请求打到数据库,

    短期的不一致是因为,如果访问一个不存在的数据,这时将它存为null,然后数据库将这条数据插入到数据库,别人访问时还是null,

    可以在插入时主动更新,但也会有新的问题

  • 布隆过滤

    • 优点:内存占用较少,没有多余的key
    • 缺点:
      • 实现复杂
      • 存在误判可能

    不存在一定不存在,存在可能存在

    只用布隆过滤器的话,也会有一定的穿透可能:布隆判断存在,这时缓存和数据库中数据可能是不存在的,这样也造成了穿透

    布隆过滤器不能修改,想修改只能删除,再创一个布隆过滤器

  • 增强id的复杂度,避免被猜测id规律

  • 做好数据的基础格式校验

  • 加强用户权限校验

  • 做好热点参数的限流.。

2.缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

解决方案

  • 给不同的key的TTL添加随机值
  • 利用Redis集群提高服务的可用性
  • 给缓存业务添加降级限流策略
  • 给业务添加多段缓存

3.缓存击穿

缓存击穿问题也叫热点key问题,就是一个被高并发访问并且缓存重建业务比较复杂的key突然失效了,无效的请求访问会在瞬间给数据库带来巨大的冲击。

缓存重建业务比较复杂是,在缓存未命中,查询数据库,到写入缓存这一阶段,比较复杂,用时比较长,加上它又是一个热点数据,所以会出现击穿问题

解决方案

  • 互斥锁
    • 缺点:一个线程获取锁后,别的线程会一致等待,用户体验不太好,可以添加一些降级策略
    • 一致性较高
  • 逻辑过期
    • 可用性较高

image-20250307152833523

image-20250307152915322