Redis-12-缓存穿透和雪崩

1、缓存穿透

  • 概念

    • 查询一个数据,缓存中没有,数据库中也没有,当这种空数据过多时,都去请求了持久层数据库

  • 代价

    • 给数据库造成很大的压力

  • 解决方案

    • 1、布隆过滤器

      • 一种数据结构,对所有可能查询的参数以Hash形式储存在控制层先进行校验,不符合就丢弃,从而避免了对底层存储系统的查询压力

    • 2、缓存空对象

      • 当存储层不命中后,即使返回的空对象也将其存储起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源

      • 存在问题

        • 存储大量空值对缓存空间有影响

        • 即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间的不一致,对数据的一致性会有影响

 

2、缓存击穿

  • 概念

    • 一个key非常热点,不停的扛着大并发,当这个key在失效的瞬间,持续的大并发就会穿破缓存,直接请求数据库

  • 代价

    • 缓存过期,会同时访问数据库来查询最新数据库,并且回写缓存,会导致数据库瞬间压力过大

  • 解决方案

    • 1、设置热点数据永不过期

    • 2、加互斥锁

      • 使用分布式锁,保证对于每个Key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可

      • 这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大

 

3、缓存雪崩

  • 概念

    • 在某个时间段,缓存集中过期失效

  • 代价

    • 数据库服务器有可能会宕机

  • 解决方案

    • 1、Redis高可用

      • 搭建Redis集群

    • 2、限流降级

      • 在缓存失效时,通过加锁或者队列来控制数据库写缓存的线程数量

    • 3、数据预热

      • 在正式部署之前,把可能的数据预先访问一遍,这样大量访问的数据就会加载到缓存中,在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀

原文地址:https://www.cnblogs.com/LittleSkinny/p/13696958.html