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

    缓存穿透(查不到导致)

    缓存穿透指用户要查询一个数据,首先经过redis内存,没有查到,于是向持久层数据库查询,本次查询失败,当用户很多时,频繁向持久层数据库发起查询,会给持久层数据库造成很大的压力,相当于出现了缓存穿透。

    解决方案:

    布隆过滤器

    布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合的请求则丢弃,从而避免了对底层存储系统的查询压力。

    缓存空对象

    当存储层没有查到数据时,返回的空对象也缓存在redis中,同时设置一个过期时间,当客户在访问这个数据时,就可以从缓存中获取空对象,保护了后端的数据库。

    存在的问题:

    • 空值可以被缓存起来,意味着缓存需要更多存储空间来存储key,多个key都可能value为空

    • 即使对空值设置了过期时间,还是会存在缓存yu存储层的数据在一段过期时间内数据不一致的问题

    缓存击穿(并发量太大,缓存过期导致)

    缓存击穿指一个key非常热点,在高并发情况下,集中查询同一个key,当这个key失效的瞬间,高并发就会穿破缓存,同时请求数据库,并且回写缓存,导致数据库瞬间压力过大。 (例:微博服务器宕机)

    解决方案:

      加互斥锁

      分布式锁:使用分布式锁,保证同一个key通知只有一个线程去查询后端服务,其他线程没有获得锁的权限,等待即可, 将高并发压力转移到了分布式锁,因此对分布式锁考验很大。

    缓存雪崩

    缓存雪崩指在某一个时间段,缓存集中过期失效,redis宕机。

     

    例如双十一业务高峰期,停掉部分服务,保证主要的服务可用。

    解决方案

    1. redis搭建集群(异地多活)
    2. 限流降级

        缓存失效后,通过加锁或者队列控制读数据库的线程数量,比如对某个key只允许一个线程查询和写缓存。

    1. 数据预热

        在正式发布之前,将可能的数据预先访问,加载到缓存中,在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

  • 相关阅读:
    FileDescriptor详解
    java序列化
    ObjectInputStream和ObejctOutputStream
    ByteArrayOutputStream
    ByteArrayInputStream
    PipedInputStream/PipedOutputStream
    字节输入流
    反义
    贪婪和非贪婪
    MYSQL数据库优化
  • 原文地址:https://www.cnblogs.com/jiezai/p/14039628.html
Copyright © 2011-2022 走看看