作者:李艳鹏,阿里资深技术专家!著有《可伸缩服务架构》,《分布式服务架构》等作品,在区块链,聚合支付,电商等领域有一定的积累!

0 题记

缓存穿透、缓存并发和缓存雪崩是常见的由于并发量大而导致的缓存问题,本文讲解其产生原因和解决方案。

缓存穿透通常是由恶意攻击或者无意造成的;缓存并发是由设计不足造成的;缓存雪崩是由缓存同时失效造成的,三种问题都比较典型,也是难以防范和解决的。本节给出通用的解决方案,以供在缓存设计的过程中参考和使用。

1 缓存穿透

缓存穿透指的是使用不存在的key进行大量的高并发查询,这导致缓存无法命中,每次请求都要穿透到后端数据库系统进行查询,使数据库压力过大,甚至使数据库服务被压死。

我们通常将空值缓存起来,再次接收到同样的查询请求时,若命中缓存并且值为空,就会直接返回,不会透传到数据库,避免缓存穿透。当然,有时恶意袭击者可以猜到我们使用了这种方案,每次都会使用不同的参数来查询,这就需要我们对输入的参数进行过滤,例如,如果我们使用ID进行查询,则可以对ID的格式进行分析,如果不符合产生ID的规则,就直接拒绝,或者在ID上放入时间信息,根据时间信息判断ID是否合法,或者是否是我们曾经生成的ID,这样可以拦截一定的无效请求。

当然,每个设计人员都应该对服务的可用性和健壮性负责,应该建设健壮的服务,让我们的服务像不倒翁一样,因此,我们需要对服务设计限流和熔断等功能,请参考《分布式服务架构:原理、设计与实战》中第1章关于微服务设计模式的内容。

2 缓存并发

缓存并发的问题通常发生在高并发的场景下,当一个缓存key过期时,因为访问这个缓存key 的请求量较大,多个请求同时发现缓存过期,因此多个请求会同时访问数据库来查询最新数据,并且回写缓存,这样会造成应用和数据库的负载增加,性能降低,由于并发较高,甚至会导致数据库被压死。

我们通常有3种方式来解决这个问题。

分布式锁

使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大。

本地锁

与分布式锁类似,我们通过本地锁的方式来限制只有一个线程去数据库中查询数据,而其他线程只需等待,等前面的线程查询到数据后再访问缓存。但是,这种方法只能限制一个服务节点只有一个线程去数据库中查询,如果一个服务有多个节点,则还会有多个数据库查询操作,也就是说在节点数量较多的情况下并没有完全解决缓存并发的问题。

软过期

软过期指对缓存中的数据设置失效时间,就是不使用缓存服务提供的过期时间,而是业务层在数据中存储过期时间信息,由业务程序判断是否过期并更新,在发现了数据即将过期时,将缓存的时效延长,程序可以派遣一个线程去数据库中获取最新的数据,其他线程这时看到延长了的过期时间,就会继续使用旧数据,等派遣的线程获取最新数据后再更新缓存。

也可以通过异步更新服务来更新设置软过期的缓存,这样应用层就不用关心缓存并发的问题了。

3 缓存雪崩

缓存雪崩指缓存服务器重启或者大量缓存集中在某一个时间段内失效,给后端数据库造成瞬时的负载升高的压力,甚至压垮数据库的情况。

通常的解决办法是对不同的数据使用不同的失效时间,甚至对相同的数据、不同的请求使用不同的失效时间,例如,我们要缓存user数据,会对每个用户的数据设置不同的缓存过期时间,可以定义一个基础时间,假设10秒,然后加上一个两秒以内的随机数,过期时间为10~12秒,就会避免缓存雪崩。

主人...看完了点个赞再走吧

缓存穿透、并发和雪崩那些事相关推荐

  1. Redis缓存穿透击穿和雪崩(八)

    1. 缓存穿透 1.1. 定义 如果用户的请求Redis缓存没有,mysql持久层也没有这个数据,于是本地查询失败.当用户请求很多(或者恶意攻击)且都是这种缓存和持久层都没有命中的情况时,大量的请求持 ...

  2. Redis的缓存穿透问题和雪崩问题?

    缓存穿透:就是访问redis中一个不存在的key的时候,会直接穿过缓存,去数据库中进行查询. 如果是黑客,进行恶意攻击的时候,每次都请求超过2000个/秒的时候,这个时候mysql基本上就挂了. 解决 ...

  3. 一个缓存穿透引发的血案

    2010年9月23日,Facebook遭遇了迄今为止最严重的宕机事件之一,网站关闭了4个小时.为恢复工作,不得不让FB下线,影响了10亿用户. 在事后的故障报告中提到: 今天,我们修改了一个错误的配置 ...

  4. 转载,关于缓存穿透、缓存并发、缓存雪崩那些事

    0 题记 缓存穿透.缓存并发和缓存雪崩是常见的由于并发量大而导致的缓存问题,本文讲解其产生原因和解决方案. 缓存穿透通常是由恶意×××或者无意造成的:缓存并发是由设计不足造成的:缓存雪崩是由缓存同时失 ...

  5. 缓存穿透,瞬间并发,缓存雪崩的解决方法

    一.缓存穿透: 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透. 解决办法: 1.布 ...

  6. 缓存穿透、缓存雪崩、redis并发

    把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数据量很大的时候,经典的几个问题如下: (一)缓存和数据库间数据一致性问题 分布式环境下(单机就不用说了)非 ...

  7. redis缓存穿透、缓存雪崩、缓存击穿、并发竞争

    关注微信公众号"虾米聊吧",每天更新一篇技术文章,文章内容涵盖架构师成长必经之路应掌握的技术,一起学习,一起交流. 缓存穿透.缓存雪崩.缓存击穿.并发竞争是缓存最常见的几个问题,接 ...

  8. Redis系列教程(三):如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题

    Java相关的面试都会问到缓存的问题:史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等,除此之外还会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等不常见的问题,但却是非 ...

  9. 【重难点】【Redis 03】缓存雪崩、缓存穿透、缓存击穿、Redis 的内存过期策略、并发读写和双写

    [重难点][Redis 03]缓存雪崩.缓存穿透.缓存击穿.Redis 的内存过期策略.并发读写和双写 文章目录 [重难点][Redis 03]缓存雪崩.缓存穿透.缓存击穿.Redis 的内存过期策略 ...

最新文章

  1. c语言课程设计学生籍贯信息记录簿,C语言课程设计 学生籍贯信息记录簿设计.doc...
  2. WijmoJS 使用Web Workers技术,让前端 PDF 导出效率更高效
  3. SQL Server text field里面有换行符的时候copy到excel数据会散乱
  4. Kubernetes Nginx Ingress 安装与使用
  5. 基于Matlab的标记分水岭分割算法(imreconstruct)
  6. Java变量的作用域
  7. JS-获取当前日期-月的天数
  8. [leetcode]1185. 一周中的第几天
  9. 如何在ESXi5.1上运行一个虚拟的ESXi虚拟机并且在这个虚拟的ESXi虚拟机里运行64位的系统?...
  10. 163 镜像源 linux,网易163的Ubuntu apt镜像源
  11. 2019华为杯研究生数学建模竞赛总结(E题 国一)
  12. Dubbo调优 -- 超时TimeOut
  13. 170313-pyGUI爬虫和正则回溯陷阱
  14. 解决warnings potentially fixable with the `--fix`
  15. linux 修改pptp端口,请教pptp修改1723端口的问题
  16. Android 开发推荐书籍
  17. 瑞萨开发板编译和烧录
  18. 一、欢迎来到趣味编程的世界
  19. php限制pc访问,禁止直接访问网首首页index.php文件的方法Windows服务器操作系统 -电脑资料...
  20. java单词排序_java中实现将输入的单词按首字母排序

热门文章

  1. A-棋盘问题(dfs)
  2. android系统休眠发广播,Android - BroadcastReceiver
  3. 接口 500_Yamaha Sonogenic SHS-500肩背键盘 全方位测评
  4. for循环递减_讲讲关于循环的那些事
  5. opencvsharp 如何提取十字交叉点坐标_如何提取OpenFOAM计算结果的体心坐标
  6. 学计算机应用英语词汇,计算机应用常用英语词汇 10
  7. 超越时代的天才——图灵
  8. 使用MarkDown画矩阵
  9. 《Python从小白到大牛》第4章 Python语法基础
  10. 找出1个小时前更新的文件并进行拷贝