Redis缓存击穿问题及解决思路
Redis缓存击穿问题及解决思路
- 1. 什么是缓存击穿
- 2. 解决方案
- 2.1 使用锁来解决(互斥锁)
- 2.2 逻辑过期
- 2.3 进行对比
1. 什么是缓存击穿
缓存击穿也叫热点key问题,就是一个被高并发访问并且缓存重建业务比较复杂的key突然失效了,无数的请求会在一瞬间给数据库带来巨大的冲击。也是缓存雪崩中的一个特例。
2. 解决方案
常见的解决方案有两种:
- 互斥锁
- 逻辑过期
逻辑分析:假设线程1在查询缓存之后,本来应该去查询数据库,然后把这个数据重新加载到缓存的,此时要线程1走完这个逻辑,其他线程就可以从缓存中获取这个数据了,但是线程1在没有走完之前,后续的线程2 3 4 同事来访问这个方法,那么这些线程都不能从缓存中获取数据,那么他们就会同一时间去查缓存,缓存没数据,接着同时去查数据库,同时执行数据库代码,给数据库带来巨大压力。
2.1 使用锁来解决(互斥锁)
因为锁能实现互斥性。假设线程过来,只能一个个的来访问数据库,从而避免对数据库访问压力过大,但是这也会影响查询性能,因为此时会让查询的性能从并行编程串行,我们可以采用tryLocak方法+double check来解决这样的问题。
假设现在线程1过来访问,他查询的缓存没有命中,但是此时他获得了锁的资源,那么线程1一个人去执行逻辑,假设线程2过来,线程2在执行过程中,并没有获得锁,那么线程2就可以进行休眠,直到线程1把锁释放后,线程2获得锁,然后再来执行逻辑,此时就能从缓存中拿到数据了。
2.2 逻辑过期
方案分析:我们之所以会出现这个缓存击穿问题,主要原因是在于我们对key设置了过期时间,假设我们不设置过期时间,其实就不会有缓存击穿的问题,但是不设置过期时间,这样数据不就一直占用我们内存了吗,我们可以采用逻辑过期方案。
我们把过期时间设置在redis的value中,注意:这个过期时间并不会直接作用于redis,而是我们后续通过逻辑代码去处理。假设线程1去查询缓存,然后从value中判断出来当前的数据已经过期了,此时线程1去获得互斥锁,那么其他的线程会进行阻塞,获得了锁的线程他会开启一个线程去进行以前的重构数据的逻辑,直到新开的线程完成这个了逻辑后,才释放锁,而线程1直接进行返回,假设现在线程3过来访问,由于线程2持有着锁,所以线程3无法获得锁,线程3也直接返回数据,只有等到新开的线程2把重建的数据构建完后,其他线程才能走返回正确的数据。
这种方案巧妙在于,异步的构建缓存,缺点在于在构建完缓存之前,返回的都是脏数据。
2.3 进行对比
互斥锁方案: 由于保证了互斥性,所以数据一致,且实现简单,因此仅仅只需要加一把锁而已,也没有其他的事情需要操心,所以没有额外的内存消耗,缺点在于有锁就会产生死锁,且只能串行执行性能肯定受到影响。
逻辑过期方案: 线程读取过程不需要等待,性能好,有一个额外的线程持有锁去重构数据,但是在重构数据完成之前,其他线程只能返回之前的数据,且实现起来麻烦。
参考资料:
黑马Redis资料。
若有错误,希望大佬指出。
对你有帮助给点个
Redis缓存击穿问题及解决思路相关推荐
- Redis 缓存击穿,缓存穿透,缓存雪崩原因+解决方案
一.前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是 ...
- Redis缓存击穿,缓存穿透,缓存雪崩,附解决方案
前言 在日常的项目中,缓存的使用场景是比较多的.缓存是分布式系统中的重要组件,主要解决在高并发.大数据场景下,热点数据访问的性能问题,提高性能的数据快速访问.本文以Redis作为缓存时,针对常见的缓存 ...
- Redis 缓存击穿
Redis 缓存击穿,失效以及维度划分 缓存击穿 缓存击穿问题解决 1 互斥锁 2 key设置永不过期 图左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构. 收益: ①加速读写:因 ...
- Redis缓存击穿,穿透,雪崩等问题
雪崩(随机过期时间.永不过期). 穿透(表示恶意请求,在系统端判断是否符合规则,比如id<0,布隆过滤器). 击穿(查询加for update,永不过期) redis缓存穿透:查询一个数据库中不 ...
- 谈谈redis缓存击穿透和缓存击穿的区别,雪崩效应
谈谈redis缓存击穿透和缓存击穿的区别,雪崩效应 面试经历 在很长的一段时间里,我以为缓存击穿和缓存穿透是一个东西,直到最近去腾讯面试,面试官问我缓存击穿和穿透的区别:我回答它俩是一样的,面试官马上 ...
- Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
欢迎关注方志朋的博客,回复"666"获面试宝典 原始数据存储在 DB 中(如 MySQL.Hbase 等),但 DB 的读写性能低.延迟高. 比如 MySQL 在 4 核 8G 上 ...
- Redis缓存击穿、雪崩、穿透!(超详细)
缓存的击穿.穿透和雪崩应该是再熟悉不过的词了,也是面试常问的高频试题. 不过,对于这三大缓存的问题,有很多人背过了解决方案,却少有人能把思路给理清的. 而且,网络上仍然充斥着,大量不太靠谱的解决方案, ...
- redis 缓存击穿 看一篇成高手系列 三
什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询,这样缓存就失去了意义.如果 ...
- Redis缓存击穿和缓存雪崩、缓存穿透以及对应的解决方案
目录 缓存击穿 缓存击穿的解决方案 缓存雪崩 缓存雪崩的解决方案 缓存穿透 布隆过滤器 缓存击穿 一般我们会对缓存的key设置过期时间,在高并发下,如果在某一时刻这个key刚好过期,此时持续的大并发请 ...
最新文章
- Django使用已经存有数据的mysql数据库
- Java程序员必看!2021最新爱奇艺Java社招面试题目
- 我所遭遇过的中间件--VTK
- 从键盘中读取字符流 自定义异常
- ann2snn的代码分析
- windows上查看和设置weblogic的编码格式
- 页面报错500是什么意思_解决方案:品牌备案后,上传产品报错5461,A+页面报错...
- 交换机的基本配置实验报告_交换机入门配置,最基本的IP及登录方式配置,一分钟了解下...
- mac下宿主机与virtualbox中的Ubuntu建立ssh连接
- mybatis的mysql分页_使用MyBatis+Mysql实现分页的插件PageInfo使用介绍
- 汉字的字向量、词向量和表示学习(中文词向量)
- 《SQL Server 2000 完全实战:数据转换服务(DTS)》
- JavaScript备忘录
- 我的QQ斗地主史及斗地主经验
- mariaDB安装与配置
- asic面试题目 英伟达_英伟达笔试题目ASIC|英伟达笔试题
- 国内主流集群渲染管理软件介绍
- 大学计算机知识点cad,大学cad考试试题「附答案」
- 量化投资中常用python代码分析(一)
- beyond compare 过期解决方法