关注微信公众号“虾米聊吧”,每天更新一篇技术文章,文章内容涵盖架构师成长必经之路应掌握的技术,一起学习,一起交流。

缓存穿透、缓存雪崩、缓存击穿、并发竞争是缓存最常见的几个问题,接下来我们简单谈谈关于这他们的出现场景以及可能的解决方案都有哪些?

**缓存穿透**

概念:是指查询一个不存在的数据,由于缓存无法命中,该请求将去查询数据库,但是数据库也无此记录,并且出于容错考虑,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到数据存储层(比如mysql)去查询,导致缓存失去了意义。如果在流量大的时候可能还会导致我们的数据库服务直接挂掉,而且要是有人利用不存在的key频繁攻击我们的应用,那这就成了我们系统的一个漏洞

解决:其实我们可以对空结果集也进行缓存,比如将该空结果集缓存为unknow,这样缓存就会命中,减少db的访问压力,但需要把它的过期时间设置很短,最长不超过五分钟。

**缓存雪崩**

概念:是指缓存中大批量数据到期,在某一时刻同时失效(可能是由于我们设置缓存时采用了相同的过期时间),而查询量巨大,此时请求将全部转发到DB,导致DB因无法承受如此大的瞬时压力而雪崩。

解决:原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

**缓存击穿**

概念:是指对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:如果这个key在大量请求同时进来之前正好失效,那么所有对这个key的数据查询都落到db,我们称为缓存击穿。

解决:加锁(分布式锁);对该热点key进行加锁,只允许加锁成功的当前请求直接访问db,等待当前请求访问完成并且写入redis后释放锁,那么后续的等待的大量请求就会直接走缓存了,这样将大大降低db的访问压力。

缓存击穿与缓存雪崩的区别:

1. 击穿是一个热点key失效

2. 雪崩是很多key集体失效

**redis并发竞争问题**

所谓redis的并发竞争问题是指多个客户端同时并发写同一个key,可能本来应该先写的数据后写了,产生了顺序不一致从而导致数据版本错乱了。或者是多个客户端同时获取同一个key,修改值后再写回去,如果这个写的顺序错了,那么最终获取的数据就错了。

比如多个客户端同时写一个key,初始值为A,本来需要按顺序依次修改为B、C、D,最后的结果为D,但是可能在并发写的时候顺序变了比如变成了C、D、B,那么最终的结果就成了B,然鹅,这并不是我们想要的结果。

那么我们怎么来解决这个问题呢?常用的有如下两种方案:1.分布式锁+版本号(时间戳)   2.消息队列MQ

1.分布式锁+版本号(时间戳)

分布式锁这里就不多做介绍了,即谁抢到了锁谁就可以操作该key,其目的就是保证同一时刻只有一个线程来操作key。

时间戳的目的就是为了做一个标识,即每个数据都携带一个时间戳,

比如:A:12:00 、 B:12:01、C:12:02、D:12:03,假如B先抢到锁,设置了key的值,并且数据时间为12.01,后面A抢到锁,和现有key中的值一对比发现自己数据的时间早于缓存中数据时间戳(12:00<12:01),那么此时A就不做任何操作了。

2.消息队列MQ的方式:

在并发量过大的情况下,可以通过消息中间件进行处理,把并行读写进行串行化。

即把所有操作都放在队列中使其串行化一个一个执行这样就可以保证执行的顺序性了

这种方式在一些高并发的场景中是一种通用的解决方案。

关注微信公众号“虾米聊吧”,获取更多知识资料干货~,一起交流,一起学习~,

一起打卡学习,一起交流进步吧!

微信扫描二维码,关注我的公众号

redis缓存穿透、缓存雪崩、缓存击穿、并发竞争相关推荐

  1. Redis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)

    一.概述 ① 缓存穿透:大量请求根本不存在的key(下文详解) ② 缓存雪崩:redis中大量key集体过期(下文详解) ③ 缓存击穿:redis中一个热点key过期(大量用户访问该热点key,但是热 ...

  2. 什么是缓存穿透、雪崩、击穿以及解决方案

    目录 1.缓存穿透 2.缓存雪崩 3.缓存击穿 4.区别总结 5.加锁实现 1.缓存穿透 描述: 在查询一个数据时,在缓存中不存在,将去数据库进行查询并且数据库中也不存在数据,使得缓存中一直不会存在数 ...

  3. 一篇吃透Redis缓存穿透、雪崩、击穿问题

    前言:在学Redis之前我们查询数据的时候都是直接查询数据库的,但是这样会有一个潜在的问题:"如果用户量很大,所有请求都去访问数据库,那么会使数据库压力过大,导致性能下降甚至宕机" ...

  4. mysql数据库击穿_面试中经常出现的缓存穿透、雪崩和击穿到底是什么?

    对于缓存穿透.缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是何方神圣 ​ ​ redis缓存穿透 ​理解重在穿透吧,也就是访问透过redis直接经过mysql,通常是一个不存在的key,在数据 ...

  5. 缓存穿透、雪崩、击穿的区分

    缓存穿透: 是指用户查询一个不存在的数据,由于缓存无法命中,将去查询数据库,但是数据库也无此记录,并且出于容错考虑,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去 ...

  6. Redis全部知识总结(概念、安装、用法、数据类型、事务、持久化、Jeids、订阅系统、缓存穿透及雪崩等)

    Redis NoSql简述 Nosql概念 Nosql的四大分类 Redis概述 Redis的安装 安装文件 Window下安装 Linux下安装 redis-benchmark 压力测试工具 五大数 ...

  7. Redis11_缓存穿透和雪崩

    Redis11_缓存穿透和雪崩 缓存穿透 用户查询某个数据时,会先在redis缓存中查询,如果缓存没有命中,会去持久层数据库MySQL中查询,如果此时依然没有命中,将返回null,不会写入缓存. 当同 ...

  8. 二十七、Redis缓存穿透和雪崩(完)

    Redis缓存穿透和雪崩 一.服务的高可用问题 在这里我们不会详细的区分析解决方案的底层! Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中 ...

  9. 21_Redis_浅析Redis缓存穿透和雪崩

    为什么了解缓存穿透和雪崩:保证服务的高可用问题 Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中,最要害的问题,就是数据的一致性问题,从严格 ...

  10. Redis 缓存穿透、雪崩、缓存数据库不一致、持久化方式、分布式锁、过期策略

    1. Redis 缓存穿透 1.1 Redis 缓存穿透概念 访问了不存在的 key,缓存未命中,请求会穿透到 DB,量大时可能会对 DB 造成压力导致服务异常. 由于不恰当的业务功能实现,或者外部恶 ...

最新文章

  1. python def method_给python类动态添加方法(method)
  2. 操作系统--系统调用
  3. Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
  4. javaone_代理的JavaOne 2014观察
  5. iOS:以前笔记,未整理版。太多了,先放着吧。。。。。。。
  6. WebRTC架构和协议栈-zz
  7. html加密原理,说说Html5视频加密播放原理
  8. office 2007插入带圈字符
  9. 考研助手软件制作记录
  10. linux unison数据同步,linux下unison双向数据实时同步
  11. AD9的pcb 里面怎样才能从TOP层视图换成从BOTTOM层网上面看,相当于把板子翻过来看
  12. 学习笔记(02):3华为工程师 ,带你实战C++(2018版)-02仿函数与智能指针的自实现...
  13. 《C++语言程序设计(第4版)学生用书》课程学习(12)——第12章 异常处理
  14. 在群晖上搭建基于 PostgreSQL 的 Joplin Server
  15. python数据分析流程
  16. 太用力的人跑不远[致刚毕业奋斗的自己,永不止步]
  17. Mysql各数据库引擎优缺点,以及常用表锁,行锁,页面锁(个人总结)
  18. 五分钟了解机智云自助接入流程
  19. CSRF漏洞利用以及防御手段(详细解释)
  20. 利用MATLAB理解常见概率分布

热门文章

  1. session共享mysql_多服务器session共享之mysql共享
  2. 《深入理解OSGi:Equinox原理、应用与最佳实践》一2.2 Bundle
  3. 《Spring揭秘》——IOC梳理2(容器启动,bean生命周期)
  4. Tomcat8.01及nginx-1.8.1安装
  5. c language compile process.
  6. Leetcode#206Reverse Linked List
  7. 〖前端开发〗HTML/CSS基础知识学习笔记
  8. Lucene.Net(转)
  9. 图片不能及时显示_湘D车主注意!衡阳多个十字路增设电子显示屏
  10. CSS Hack(Safari、Opera、Chrome、IE6、IE7、 IE8和IE9)