一篇吃透Redis缓存穿透、雪崩、击穿问题

 更新时间:2023年05月22日 11:33:30   作者:地大第一渣男  
这篇文主要介绍了Redis缓存穿透,缓存雪崩,缓存击穿的问题解决方法,文中有详细的图文介绍,对大家了解Redis有一定的帮助,需要的朋友可以参考下

前言:在学Redis之前我们查询数据的时候都是直接查询数据库的,但是这样会有一个潜在的问题:“如果用户量很大,所有请求都去访问数据库,那么会使数据库压力过大,导致性能下降甚至宕机”。因此,我们需要把经常访问的数据放到缓存中,这里我们用Redis作为缓存。

但是,使用Redis作为缓存的过程中我们一般如下,如下图:我们查询某个数据,前端发送请求到后端,后端根据请求去查询数据,一开始先去Redis中查有无这个数据,如果有则直接返回,没有则去数据库中查找并且将查找到的结果返回,如果数据库中没有则返回错误信息。

那么,在使用Redis作为缓存的过程中我们避免不了会遇到以下几个常见的问题:①Redis与数据库的数据一致性问题。②缓存穿透。③缓存雪崩。④缓存击穿。

我们先来说①缓存与数据库的数据库一致性问题。

对于Redis作为缓存我们有以下用法:①只读缓存。②读写缓存。

只读缓存是指对于修改数据的时候,我们只对数据库进行修改,同时删除缓存,这样我们永远能保证数据库中有最新的数据,但是这样每次修改数据的时候,我们查找该数据的时候都需要查找一次数据库,因此性能会有所降低。

读写缓存是指我们修改数据的时候对缓存的数据也直接进行修改,那么又可以分为两种:①同步读写②异步读写。

同步读写是指修改数据的时候同时修改缓存和数据库,并且通过事务的特性保证二者数据一致性,但是由于缓存的速度远快于数据库的速度,因此性能还是会有一定的限制。

异步读写是指我们每次修改数据都是在缓存中修改,每隔一段时间将缓存中的数据导入数据库中,这样每次修改的时间只是修改缓存数据的时间,性能大大提高。但是这样会存在一个隐患:“当Redis突发情况宕机的时候,数据还没来得及导入数据库,那么这段时间还没保存进数据库的数据就会丢失”,因此一致性无法保证。

然后我们来说说②缓存穿透。由我们Redis作为缓存的流程图可以知道:我们每次查询数据的时候都是先查询缓存,查询不到再查数据库,如果数据库中也查询不到则返回错误信息。

那么,对于一个查询不到的数据,如果有心怀不轨的人,写一个程序,多线程并发的无限查询这个数据,那么我们每次都需要访问数据库,会导致数据库性能下降甚至宕机,这就是缓存穿透。

那么,我们如何来解决缓存穿透呢?这里我们说两种方法:

方法一:Redis缓存中存储空值。我们可以知道,缓存穿透是由于某些不存在的数据,每次查询,我们在缓存中都查找不到该数据,因此每次都需要去访问数据库。那么我们可以不可以对于这些数据也存入缓存中呢?这样我们每次查找这些数据,就只会第一次查找数据库,后面都是查找缓存了。那么有人会问了?“咦,不存在的数据怎么查找呢?”所以我们这边是将某个不存在的数据存储在缓存中,并且存储的值为空字符串(也可以是其他的,这里取决于你与前端兄弟的约定)。如下图:

因此,这样我们对于这些恶意数据,就只能“骚扰”我们的宝贝数据库一次了,便解决了缓存穿透的问题,那么还有一个疑问就是:如果将来这些数据有了,但是每次查询的时候缓存都直接返回空不是嘛?不会的,因为我们以后对于数据库插入数据的同时会对Redis缓存进行一个Set,这个Set数据的操作会直接覆盖原有不存在的数据,因此并不会出现这种问题。

方法二:布隆过滤器。大致就是在前端页面和缓存直接多了一个布隆过滤器

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。布隆过滤器可以告诉我们 “某样东西一定不存在或者可能存在”,也就是说布隆过滤器说这个数不存在则一定不存,布隆过滤器说这个数存在可能不存在。

③缓存雪崩,什么是缓存雪崩呢?缓存雪崩指的是在同一时间大量Redis缓存中存储的key过期或者Redis服务器直接宕机,并且大量的请求查询这些数据的时候,会导致大量请求一窝蜂的涌向数据库进行查询,导致数据库压力过大,性能下降甚至宕机。那么如何解决缓存雪崩呢?

对于情况一:大量key同时过期,这里说几种解决方法:

①设置缓存key过期时间可以随机设置,这样不会使得大量的key同一时间段内过期。

②服务降级:指的是对于一些非核心数据来说(比如查询一些无关紧要的数据时)我们可以预先设置一些值,当无法访问缓存的时候,这些数据不会直接查询数据库,而是返回预先设置的值,比如一些错误信息。

对于情况二:Redis服务器直接宕机,这里说几种解决方法:

①搭建Redis服务集群:尝试构建 Redis 的高可用集群,比如当某主节点挂掉了,集群能够马上重新选出新的主节点。

②业务中实现服务熔断或者请求限流机制:

  • 服务熔断:如果监听到发生了缓存雪崩,直接暂停对缓存服务的请求,但是这种对业务的影响比较大;

  • 服务限流:可以在入口做限流,不要让所有的请求都流入到后端的服务中;

④缓存击穿:缓存雪崩指的是大量数据无法从Redis查询到,而同时去查询数据库导致,缓存击穿则是某些热点key,比如双十一抢苹果手机,如果突然间Redis缓存对于这个数据过期了,那么这一瞬间大量抢苹果手机的请求都会去访问数据库,导致数据库性能下降甚至宕机这里我们讲两种解决方法:①Redis互斥锁。②缓存数据逻辑过期。

方法一:Redis互斥锁。以上我们知道:对于某个热点key失效的时候,由于大量查询该数据的请求在缓存中查找不到,因此同时查找数据库导致。那么我们只需要对于每个数据设置一个互斥锁,当在访问不到缓存的时候,只有一个线程能够去访问数据库,其他线程等待,

  • 这样就解决了以上的问题。

但是这样会导致一个问题:那就是由于其他线程都要等待,会导致性能下降,要等那个拿到互斥锁的线程查询完数据库,并且返回数据到缓存中才能查到数据。

方法二:缓存的数据逻辑过期。我们知道,缓存击穿是由于热点key过期导致去查询数据库,那么我们可以这样想:如果这些热点key只是逻辑过期(逻辑过期指虽然过期了,但是还是在缓存里面不会删除,但是程序会知道是已过期的数据,会访问一次数据库进行更新),那么不就解决了吗?因此逻辑过期的解决思路是:对于这些热点key,先查询缓存,如果没过期则直接返回,如果过期了则开一个新的线程

去查询数据库,而查询数据库过程中访问缓存的请求直接返回旧数据即可。

但是逻辑过期由于要多一个线程,因此有一定的内存消耗,并且更新过程中访问的请求都是收到旧的数据,因此一致性有一定的下降。

以上是使用Redis缓存过程中的一些常见问题,后续会慢慢补充。

以上就是一篇吃透Redis缓存穿透、雪崩、击穿问题的详细内容,更多关于Redis缓存穿透、雪崩、击穿的资料请关注脚本之家其它相关文章!

相关文章

  • redis5.0以上基于密码认证的集群cluster方式

    redis5.0以上基于密码认证的集群cluster方式

    这篇文章主要介绍了redis5.0以上基于密码认证的集群cluster方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 关于Redis的读写一致问题

    关于Redis的读写一致问题

    在项目使用Redis过程中,当数据更新时,我们要保证缓存和数据库的一致性,否则会导致很多脏数据出现,此时我们就要思考如何去进行数据更新,本文就给大家讲讲关于redis的读写一致问题,需要的朋友可以参考下
    2023-08-08
  • Redis Lua脚本的使用教程

    Redis Lua脚本的使用教程

    在Redis的学习中,Lua脚本是一项强大的高级特性,它允许用户在Redis中执行复杂的操作,本文就来介绍一下Redis Lua,脚本的使用教程,感兴趣的可以了解一下
    2024-03-03
  • Redis的LRU机制介绍

    Redis的LRU机制介绍

    这篇文章主要介绍了Redis的LRU机制介绍,Redis会按LRU算法删除设置了过期时间但还没有过期的key,而对于没有设置过期时间的key,Redis是永远保留的,需要的朋友可以参考下
    2015-06-06
  • 让Redis在你的系统中发挥更大作用的几点建议

    让Redis在你的系统中发挥更大作用的几点建议

    Redis在很多方面与其他数据库解决方案不同:它使用内存提供主存储支持,而仅使用硬盘做持久性的存储;它的数据模型非常独特,用的是单线程。另一个大区别在于,你可以在开发环境中使用Redis的功能,但却不需要转到Redis
    2014-06-06
  • 5分钟搭建redis集群(redis5.0.5)

    5分钟搭建redis集群(redis5.0.5)

    本文主要介绍了5分钟搭建redis集群,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 基于redis 7.2.3的makefile源码解读学习

    基于redis 7.2.3的makefile源码解读学习

    这篇文章主要为大家介绍了基于redis 7.2.3的makefile源码解读学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Redis下载部署并加入idea应用的小结

    Redis下载部署并加入idea应用的小结

    这篇文章主要介绍了Redis下载部署并加入idea应用,需要的朋友可以参考下
    2022-10-10
  • 聊一聊redis奇葩数据类型与集群知识

    聊一聊redis奇葩数据类型与集群知识

    现在越来越多的项目都会利用到redis,多实例redis服务比单实例要复杂的多,这里面涉及到定位、容错、扩容等技术问题,下面这篇文章主要给大家介绍了关于redis奇葩数据类型与集群知识的相关资料,需要的朋友可以参考下
    2022-01-01
  • 解析Redis未授权访问漏洞复现与利用危害

    解析Redis未授权访问漏洞复现与利用危害

    这篇文章主要介绍了Redis未授权访问漏洞复现与利用,介绍了redis未授权访问漏洞的基本概念及漏洞的危害,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-01-01

最新评论