zoukankan      html  css  js  c++  java
  • Redis-12-缓存穿透和雪崩

    1、缓存穿透

    • 概念

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

    • 代价

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

    • 解决方案

      • 1、布隆过滤器

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

      • 2、缓存空对象

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

        • 存在问题

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

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

     

    2、缓存击穿

    • 概念

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

    • 代价

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

    • 解决方案

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

      • 2、加互斥锁

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

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

     

    3、缓存雪崩

    • 概念

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

    • 代价

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

    • 解决方案

      • 1、Redis高可用

        • 搭建Redis集群

      • 2、限流降级

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

      • 3、数据预热

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

  • 相关阅读:
    退出程序
    筛选datatable
    1-2 开发环境搭建-Windows平台
    5-1 安全发布对象-发布与逸出
    4-4 线程安全性-可见性
    4-3 线程安全性-原子性-synchronized
    4-2 线程安全性-原子性-atomic-2
    4-1 线程安全性-原子性-atomic-1
    Spring
    Spring
  • 原文地址:https://www.cnblogs.com/LittleSkinny/p/13696958.html
Copyright © 2011-2022 走看看