zoukankan      html  css  js  c++  java
  • Redis-缓存读写问题

    缓存处理流程

    前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。

    img

    缓存穿透

    缓存穿透是指查询一个一定不存在redis的数据,由于缓存不命中时需要从持久层数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

    解决办法

    • 布隆过滤器:对所有可能查询的参数以hash形式存储,当用户想要查询的时候,使用布隆过滤器发现不在集合中,就直接丢弃,不再对持久层查询。

      • 布隆过滤器核心思想:把一个集合的每一个元素按照某种 hash 算法计算 hash 值,然后将hash 值对定义的数据长度取模,得到的值即为存在数组的索引。并将该索引位置值从 0 改为 1 。然后去判断一个元素是否在这个集合的时候,只需要对这个元素计算出数组的索引值,如果这个索引位置的值为 1 则证明该元素在集合内,反之则知道不在这个集合中。

      image-20200922150445120

      • 如上图所示,A, B, C三个元素在一个集合里面,拿到一个 D 元素,然后计算它的hash值对应于数组的位置值为 1 则表示这个 D 元素也在ABC的集合里面;接着拿到元素E 同样的计算,发现对应于数组中值为 0 则表示元素 E不在集合中。
    • 缓存空对象:当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源

      • 如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键
      • 即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

    缓存雪崩

    缓存雪崩是指在某一个时间段,缓存集中过期失效。于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。不同数据集中过期了

    image-20200922144245925

    解决办法

    • redis高可用
    • 限流降级:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。
    • 数据预热:数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
    • key设置随机过期时间,避免多个缓存key在同一时间失效

    缓存击穿

    缓存击穿是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。并发查同一条数据

    解决办法

    • 设置热点数据永远不过期
    • 加互斥锁
  • 相关阅读:
    PHP操作MYSQL数据库
    微信DLL劫持反弹shell复现
    ERROR Invalid options in vue.config.js: "baseUrl" is not allowed
    求曲线y=lnx在区间(2,6)内的一条切线,使得该切线与直线x=2,x=6及曲线y=lnx所围成的图形的面积最小。
    CentOS、Ubuntu、Debian三个linux比较异同
    jpa模糊查询(表中的某些数据)
    jpa查找数据库最新一条消息
    在@Data注释lombok上使用继承警告等于/ hashCode(Warning equals/hashCode on @Data annotation lombok with inheritance)
    git基本操作
    远程分支git换地址了,本地重新关联
  • 原文地址:https://www.cnblogs.com/binliubiao/p/13713027.html
Copyright © 2011-2022 走看看