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在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。并发查同一条数据

    解决办法

    • 设置热点数据永远不过期
    • 加互斥锁
  • 相关阅读:
    【LeetCode】048. Rotate Image
    【LeetCode】036. Valid Sudoku
    【LeetCode】060. Permutation Sequence
    【LeetCode】001. Two Sum
    【LeetCode】128. Longest Consecutive Sequence
    【LeetCode】081. Search in Rotated Sorted Array II
    【LeetCode】033. Search in Rotated Sorted Array
    顺时针打印矩阵
    矩形覆盖
    二维数组中的查找
  • 原文地址:https://www.cnblogs.com/binliubiao/p/13713027.html
Copyright © 2011-2022 走看看