Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透)

这篇具有很好参考价值的文章主要介绍了Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、缓存预热

二、缓存雪崩

三、缓存击穿

四、缓存穿透


一、缓存预热

Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透),缓存,redis,数据库

 

开过车的都知道,冬天的时候启动我们的小汽车之后不要直接驾驶,先让车子发动机预热一段时间再启动。缓存预热是一样的道理。

缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查 询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据。

如果我们不进行缓存预热会出现什么问题呢?

1. 请求数量较高

2. 主从之间数据吞吐量较大,数据同步操作频度较高,因为刚刚启动时,缓存中没有任何数据。


二、缓存雪崩

Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透),缓存,redis,数据库

 

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透),缓存,redis,数据库

 怎么解决这种问题呢?

1、给不同的Key的TTL添加随机值

2、利用Redis集群提高服务的可用性

3、给缓存业务添加降级限流策略

4、给业务添加多级缓存


三、缓存击穿

Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透),缓存,redis,数据库

 

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。

怎么解决这个问题呢?

1、互斥锁

互斥锁简单来说就是用户访问缓存时没有查到数据,于是就去获取这个互斥锁,拿到之后先不释放,然后去查询数据库找数据,再将找到的数据写入缓存,再释放锁这样的过程。在第一个线程执行此过程的同时,如果有其他线程也来访问缓存中的这个数据,因为线程1没有释放互斥锁,所以线程2就会等待,设置一个休眠时间过一段时间再重试获取互斥锁,直到线程1释放掉,线程2获取到锁之后就会在缓存中直接读取到数据。

Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透),缓存,redis,数据库

2、逻辑过期

我们之所以会出现这个缓存击穿问题,主要原因是在于我们对key设置了过期时间,假设我们不设置过期时间,其实就不会有缓存击穿的问题,但是不设置过期时间,这样数据不就一直占用我们 内存了吗,我们可以采用逻辑过期方案。

我们把过期时间设置在 redis的value中注意这个过期时间并不会直接作用于redis,而是我们后续通过逻辑去处理。假设线程1去查询缓存,然后从value中判断出来当前的数据已经过期了,此时线程1 去获得互斥锁,那么其他线程会进行阻塞,获得了锁的线程他会开启一个线程去进行以前的重构数据的逻辑,直到新开的线程完成这个逻辑后,才释放锁, 而线程1直接进行返回,假设现在线程3过来访 问,由于线程线程2持有着锁,所以线程3无法获得锁,线程3也直接返回数据,只有等到新开的线程2把重建数据构建完后,其他线程才能走返回正确的数据。

Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透),缓存,redis,数据库

 优点:异步的构建缓存,响应速度快。

 缺点:在线程2没有释放锁之前,线程1和后面的线程返回的都是脏数据。

3、对比

解决方案 优点 缺点
互斥锁

没有额外内存消耗

保证一致性

实现简单

线程需要等待,性能受影响

可能有死锁风险

逻辑过期 线程无需等待,性能好

有额外内存消耗

不保证一致性

实现复杂


四、缓存穿透

Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透),缓存,redis,数据库

 

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这 些请求都会打到数据库。

怎么解决这个问题呢?

1、缓存空对象

当我们客户端访问不存在的数据时,先请求redis,但是此时redis中没有数据, 此时会访问到数据库,但是数据库中也没有数据,这个数据穿透了缓存,直击数据库,我们都知道数据 库能够承载的并发不如redis这么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会访问到数据库,简单的解决方案就是哪怕这个数据在数据库中也不存在,我们也把这个数据当做null存入到redis 中去,这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到缓存 了

Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透),缓存,redis,数据库

 

2、布隆过滤 

布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思 想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问 redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数 据后,再将其放入到redis中。

Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透),缓存,redis,数据库

 3,对比

解决方案 优点 缺点
缓存空对象 实现简单,维护方便

额外的内存消耗

可能造成短期的不一致

布隆过滤  内存占用较少,没有多余key

实现复杂

因为使用的是哈希思想,就避免不了会产生哈希冲突,存在误判可能文章来源地址https://www.toymoban.com/news/detail-684853.html

到了这里,关于Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis7之缓存预热 + 缓存雪崩 + 缓存击穿 + 缓存穿透(八)

    缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据! 使用 @PostConstruct 初始化白名单数据 缓存雪崩就是瞬间过期数据量太大,导致对数据库服务器造

    2023年04月08日
    浏览(46)
  • 第十八章_Redis缓存预热+缓存雪崩+缓存击穿+缓存穿透

    缓存预热 缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据。 可以通过@PostConstruct初始化白名单数据 缓存雪崩 发生  redis主机挂了,Redis 全盘崩溃

    2024年02月07日
    浏览(44)
  • 探讨Redis缓存问题及解决方案:缓存穿透、缓存击穿、缓存雪崩与缓存预热(如何解决Redis缓存中的常见问题并提高应用性能)

    Redis是一种非常流行的开源缓存系统,用于缓存数据以提高应用程序性能。但是,如果我们不注意一些缓存问题,Redis也可能会导致一些性能问题。在本文中,我们将探讨Redis中的一些常见缓存问题,并提供解决方案。 缓存穿透指的是当一个请求尝试访问一个不存在于缓存中的

    2024年02月03日
    浏览(87)
  • Redis - 做缓存时高并发问题:缓存穿透、击穿、雪崩,数据库缓存双写不一致

    当用户访问的数据既不在缓存也不在数据库中时,就会导致每个用户查询都会“穿透” 缓存“直抵”数据库。这种情况就称为缓存穿透。当高度发的访问请求到达时,缓存穿透不 仅增加了响应时间,而且还会引发对 DBMS 的高并发查询,这种高并发查询很可能会导致 DBMS 的崩

    2024年02月04日
    浏览(45)
  • Redis_缓存3_缓存异常(数据不一致、雪崩、击穿、穿透)

    四个方面 缓存中数据和数据库不一致 缓存雪崩 缓存击穿 缓存穿透 14.6.1数据不一致: 一致性包括两种情况 缓存中有数据,需要和数据库值相同 缓存中没有数据,数据库中的数据是最新值 如果不符合以上两种情况,则出现数据不一致的问题。 读写缓存 同步直写 异步写回

    2024年02月13日
    浏览(40)
  • redis 缓存雪崩 && 缓存击穿 && 缓存穿透

    什么是缓存雪崩 当我们提到缓存系统中的问题,缓存雪崩是一个经常被讨论的话题。缓存雪崩是指在某一时刻发生大量的缓存失效,导致瞬间大量的请求直接打到了数据库,可能会导致数据库瞬间压力过大甚至宕机。尤其在高并发的系统中,这种情况会导致连锁反应,整个系

    2024年02月07日
    浏览(47)
  • Redis 缓存穿透、缓存雪崩、缓存击穿

    缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。 常见的解决方案有两种:         缓存空对象                  优点:实现简单,维护方便                 缺点: 额外的内存消耗 可能造

    2024年02月02日
    浏览(43)
  • Redis缓存穿透,雪崩,击穿

    1、定义 缓存 就是数据交换的 缓冲区 ,缓存就是 缓冲区内的数据 ,一般从数据库中获取,存储于本地代码。 由于其被 Static 修饰,所以随着类的加载而被加载到 内存之中 ,作为本地缓存,由于其又被 final 修饰,所以其引用和对象之间的关系是固定的,不能改变,因此不用担心赋值(=

    2024年02月10日
    浏览(47)
  • Redis缓存击穿、雪崩、穿透

    我们通过对数据库的数据进行查询后在redis中缓存,但是在高并发环境下,某个保存的key值在失效的瞬间被大量并发请求访问,这些持续的大并发量就会穿破缓存,直接请求数据库,会对数据库造成巨大压力,这些请求还会使数据多次写入缓存,多了许多不必要的操作。    

    2024年02月08日
    浏览(44)
  • REDIS缓存穿透 击穿 雪崩

    一、前言   在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包