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缓存击穿问题及解决思路相关推荐

  1. Redis 缓存击穿,缓存穿透,缓存雪崩原因+解决方案

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

  2. Redis缓存击穿,缓存穿透,缓存雪崩,附解决方案

    前言 在日常的项目中,缓存的使用场景是比较多的.缓存是分布式系统中的重要组件,主要解决在高并发.大数据场景下,热点数据访问的性能问题,提高性能的数据快速访问.本文以Redis作为缓存时,针对常见的缓存 ...

  3. Redis 缓存击穿

    Redis 缓存击穿,失效以及维度划分 缓存击穿 缓存击穿问题解决 1 互斥锁 2 key设置永不过期 图左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构. 收益: ①加速读写:因 ...

  4. Redis缓存击穿,穿透,雪崩等问题

    雪崩(随机过期时间.永不过期). 穿透(表示恶意请求,在系统端判断是否符合规则,比如id<0,布隆过滤器). 击穿(查询加for update,永不过期) redis缓存穿透:查询一个数据库中不 ...

  5. 谈谈redis缓存击穿透和缓存击穿的区别,雪崩效应

    谈谈redis缓存击穿透和缓存击穿的区别,雪崩效应 面试经历 在很长的一段时间里,我以为缓存击穿和缓存穿透是一个东西,直到最近去腾讯面试,面试官问我缓存击穿和穿透的区别:我回答它俩是一样的,面试官马上 ...

  6. Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?

    欢迎关注方志朋的博客,回复"666"获面试宝典 原始数据存储在 DB 中(如 MySQL.Hbase 等),但 DB 的读写性能低.延迟高. 比如 MySQL 在 4 核 8G 上 ...

  7. Redis缓存击穿、雪崩、穿透!(超详细)

    缓存的击穿.穿透和雪崩应该是再熟悉不过的词了,也是面试常问的高频试题. 不过,对于这三大缓存的问题,有很多人背过了解决方案,却少有人能把思路给理清的. 而且,网络上仍然充斥着,大量不太靠谱的解决方案, ...

  8. redis 缓存击穿 看一篇成高手系列 三

    什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询,这样缓存就失去了意义.如果 ...

  9. Redis缓存击穿和缓存雪崩、缓存穿透以及对应的解决方案

    目录 缓存击穿 缓存击穿的解决方案 缓存雪崩 缓存雪崩的解决方案 缓存穿透 布隆过滤器 缓存击穿 一般我们会对缓存的key设置过期时间,在高并发下,如果在某一时刻这个key刚好过期,此时持续的大并发请 ...

最新文章

  1. Django使用已经存有数据的mysql数据库
  2. Java程序员必看!2021最新爱奇艺Java社招面试题目
  3. 我所遭遇过的中间件--VTK
  4. 从键盘中读取字符流 自定义异常
  5. ann2snn的代码分析
  6. windows上查看和设置weblogic的编码格式
  7. 页面报错500是什么意思_解决方案:品牌备案后,上传产品报错5461,A+页面报错...
  8. 交换机的基本配置实验报告_交换机入门配置,最基本的IP及登录方式配置,一分钟了解下...
  9. mac下宿主机与virtualbox中的Ubuntu建立ssh连接
  10. mybatis的mysql分页_使用MyBatis+Mysql实现分页的插件PageInfo使用介绍
  11. 汉字的字向量、词向量和表示学习(中文词向量)
  12. 《SQL Server 2000 完全实战:数据转换服务(DTS)》
  13. JavaScript备忘录
  14. 我的QQ斗地主史及斗地主经验
  15. mariaDB安装与配置
  16. asic面试题目 英伟达_英伟达笔试题目ASIC|英伟达笔试题
  17. 国内主流集群渲染管理软件介绍
  18. 大学计算机知识点cad,大学cad考试试题「附答案」
  19. 量化投资中常用python代码分析(一)
  20. beyond compare 过期解决方法

热门文章

  1. 分享几款流行的医疗机器人
  2. 基于jQuery弹性展开收缩菜单插件gooey.js
  3. XSS平台的简单搭建和获取cookie
  4. mysql 学生信息管理系统
  5. Postresql 数据库年龄
  6. UE4 命令行参数(一)
  7. 【OP放大器】简单的恒压源
  8. laya龙骨换装_刘先生-laya龙骨动画的几种使用方法
  9. 5G网络的主要特性、关键技术及其发展趋势 : 奇点临近——中国如何迎接未来的5G网络革命?
  10. 165体重_我身高165cm标准体重是多少斤