Redis-08-浅谈缓存问题

8. 缓存穿透和雪崩

  • Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解。如果对数据的一致性要求很高,那么就不能使用缓存。
  • 另外的一些典型问题就是,缓存穿透、缓存雪崩和缓存击穿。目前,业界也都有比较流行的解决方案

8.1 缓存穿透

  • 什么是缓存穿透
    • 用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力
    • 说人话,就是缓存命中率太低

– 解决方案:布隆过滤器

  • 什么是布隆过滤器
    • 它实际上是一个很长的二进制向量和一系列随机映射函数。
    • 布隆过滤器可以用于检索一个元素是否在一个集合中。
    • 它的优点是空间效率和查询时间都比一般的算法要好的多
    • 缺点是有一定的误识别率和删除困难
  • 关键:布隆过滤器说存在的不一定存在,但说不存在的一定不存在

8.2 缓存击穿

  • 什么是缓存击穿
    • 一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
    • 当这个key在过期的瞬间,有大量的请求并发访问,这类数据一般是热点数据,由于缓存过期,会同时访问数据库来查询最新数据,并且回写缓存,会导使数据库瞬间压力过大。

– 解决方案:永不过期

  • 很简单,热点数据咱们过期时间就设置成长一点就好了,或者干脆就设置成永不过期

– 解决方案:互斥锁

  • 缓存击穿通常伴随着并发,这个时候,我们只需要给字段加上互斥锁,
  • 那么第一个来查询的线程拿走这个锁之后,其他线程因为拿不到这个锁只能等着。等第一个线程查询完之后,将数据存到缓存中,这样的话其他等待的线程就能在缓存里面找到了,就不用去找数据库了

8.3 缓存雪崩

  • 什么是缓存雪崩
    • 是指在某一个时间段,缓存集中过期失效。
    • 说人话,就是大量的缓存击穿同时发生

– 解决方案

  • redis高可用

    • 这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集
  • 限流降级

    • 这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待
  • 数据预热

    • 数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
posted @ 2021-01-30 21:08  PrimaBruceXu  阅读(50)  评论(0编辑  收藏  举报