首页 > 其他分享 >缓存雪崩和击穿问题及解决思路

缓存雪崩和击穿问题及解决思路

时间:2022-11-27 11:46:42浏览次数:27  
标签:缓存 过期 数据库 击穿 查询 访问 线程 雪崩

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

解决方案:

  • 给不同的Key的TTL添加随机值                     ===》在环境预热批量导入redis时发生

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

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

  • 给业务添加多级缓存

缓存击穿问题及解决思路

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

常见的解决方案有两种:

  • 互斥锁

  • 逻辑过期

逻辑分析:假设线程1在查询缓存之后,本来应该去查询数据库,然后把这个数据重新加载到缓存的,此时只要线程1走完这个逻辑,其他线程就都能从缓存中加载这些数据了,但是假设在线程1没有走完的时候,后续的线程2,线程3,线程4同时过来访问当前这个方法, 那么这些线程都不能从缓存中查询到数据,那么他们就会同一时刻来访问查询缓存,都没查到,接着同一时间去访问数据库,同时的去执行数据库代码,对数据库访问压力过大

 

 

 解决方案一、使用锁来解决:

因为锁能实现互斥性。假设线程过来,只能一个人一个人的来访问数据库,从而避免对于数据库访问压力过大,但这也会影响查询的性能,因为此时会让查询的性能从并行变成了串行,我们可以采用tryLock方法 + double check来解决这样的问题。

假设现在线程1过来访问,他查询缓存没有命中,但是此时他获得到了锁的资源,那么线程1就会一个人去执行逻辑,假设现在线程2过来,线程2在执行过程中,并没有获得到锁,那么线程2就可以进行到休眠,直到线程1把锁释放后,线程2获得到锁,然后再来执行逻辑,此时就能够从缓存中拿到数据了。

 线程2到N都在循环等待锁,等重建缓存后释放锁,部分线程可能已经过了查询未命中,拿到锁,这时应该去新建缓存吗? 应该使用双检查机制,拿到锁以后再次查询缓存,未命中再建立缓存,命中了直接返回。

 

解决方案二、逻辑过期方案

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

 

 

 进行对比

互斥锁方案:由于保证了互斥性,所以数据一致,且实现简单,因为仅仅只需要加一把锁而已,也没其他的事情需要操心,所以没有额外的内存消耗,缺点在于有锁就有死锁问题的发生,且只能串行执行性能肯定受到影响

逻辑过期方案: 线程读取过程中不需要等待,性能好,有一个额外的线程持有锁去进行重构数据,但是在重构数据完成前,其他的线程只能返回之前的数据,且实现起来麻烦

 

标签:缓存,过期,数据库,击穿,查询,访问,线程,雪崩
From: https://www.cnblogs.com/kisshappyboy/p/16929351.html

相关文章

  • 缓存穿透问题的解决思路
    缓存穿透:缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。常见的解决方案有两种:缓存空对象优点:实现简单,维......
  • 缓存更新策略
    缓存更新是redis为了节约内存而设计出来的一个东西,主要是因为内存数据宝贵,当我们向redis插入太多数据,此时就可能会导致缓存中的数据过多,所以redis会对部分数据进行更新,或者......
  • 为商户添加redis缓存
    缓存模型和思路标准的操作方式就是查询数据库之前先查询缓存,如果缓存数据存在,则直接从缓存中返回,如果缓存数据不存在,再查询数据库,然后将数据存入redis。  代码如下:......
  • 什么是缓存
    1.浏览器层缓存缓存一些静态页面等2.应用缓存将部分数据存入map,来访问时直接将map里的数据返给你。3.  缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区......
  • spring三级缓存
    IOC容器中的bean是单例的bean生命周期 什么是循环依赖    什么是成品对象和半成品对象   解决循环依赖方式  spring中使用三个map来表示三级缓......
  • HTTP缓存
    浏览器、缓存服务器、源服务器   浏览器:资源请求直接发起方。   源服务器:资源实际提供方。   缓存服务器:在浏览器、源服务器之间架设的中间服务器,由它代替浏览......
  • redis缓存击穿、缓存穿透、缓存雪崩
    redis缓存穿透、缓存击穿、缓存雪崩​ 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问......
  • 【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?
    问题描述在AzureRedis服务中,如何实现只允许AzureAppService访问呢? 问题解答AzureRedis开启防火墙的功能,并在防火墙中添加上AppService的出口IP地址即可。两步即可实......
  • Redis — 缓存方案
    1Redis—缓存方案(热数据和冷数据)1.1 新建和更新数据时,设置一个过期时间product_cache_timeout(比如24小时),查询时同时也将过期时间setinredis缓存1.2查到数据时重......
  • Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析
    摘要:一、问题:      数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求。 二、解决方案:   1.通过高速服务器Cache......