原文地址:缓存穿透、缓存并发、缓存失效之思路变迁

我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题:

缓存穿透

缓存并发

缓存失效

一、缓存穿透

 

注:
上面三个图会有什么问题呢?

我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。

这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了。

那这种问题有什么好办法解决呢?

要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

有一个比较巧妙的作法是,可以将这个不存在的key预先设定一个值,比如,"key" , “&&”。

在返回这个&&值的时候,我们的应用就可以认为这是不存在的key,那我们的应用就可以决定是否继续等待继续访问,还是放弃掉这次操作。

如果继续等待访问,过一个时间轮询点后,再次请求这个key,如果取到的值不再是&&,则可以认为这时候key有值了,从而避免了透传到数据库,从而把大量的类似请求挡在了缓存之中。

二、缓存并发

有时候如果网站并发访问高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况,如果并发确实很大,这也可能造成DB压力过大,还有缓存频繁更新的问题。

我现在的想法是对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询。

这种情况和刚才说的预先设定值问题有些类似,只不过利用锁的方式,会造成部分请求等待。

三、缓存失效

引起这个问题的主要原因还是高并发的时候,平时我们设定一个缓存的过期时间时,可能有一些会设置1分钟啊,5分钟这些,并发很高时可能会出在某一个时间同时生成了很多的缓存,

并且过期时间都一样,这个时候就可能引发一当过期时间到后,这些缓存同时失效,请求全部转发到DB,DB可能会压力过重。

那如何解决这些问题呢?

其中的一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

我们讨论的第二个问题时针对同一个缓存,第三个问题时针对很多缓存。

总结来看:

1、缓存穿透:查询一个必然不存在的数据。比如文章表,查询一个不存在的id,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成影响。

2、缓存失效:如果缓存集中在一段时间内失效,DB的压力凸显。这个没有完美解决办法,但可以分析用户行为,尽量让失效时间点均匀分布。

当发生大量的缓存穿透,例如对某个失效的缓存的大并发访问就造成了缓存雪崩。

转载于:https://www.cnblogs.com/imyalost/p/7612111.html

转浅谈缓存击穿、缓存并发和缓存失效相关推荐

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

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

  2. java缓存同步_浅谈JSON的数据交换、缓存问题和同步问题

    JSON轻量级的数据交换格式 相对于XML来说,JSON的解析速度更快,文档更小. JSON的格式 {属性名:属性值,属性名:属性值,--} 属性名的类型可以是string,number,boolea ...

  3. mysql缓存击穿_Mybatis中的缓存击穿

    前言 之前我们探讨了Mybatis中缓存模块的基本实现,对其中CacheKey和缓存的基本实现类PerpetualCache的核心代码进行了探索.传送门:Mybatis中的缓存模块实现 在上篇文章结尾 ...

  4. 服务器不知别内存_程序优化浅谈服务器实现高并发的原理

    我们每天刷手机都会接收到各种各样的信息,看到这篇文章时,不知大家有没有思考过,这些信息是如何组织,然后通过服务器发送给我们的呢? 其实也很简单,不就是一条一条请求嘛,服务器根据不同的请求分别去不同的数 ...

  5. 微信html页面缓存问题,浅谈微信页面入口文件被缓存解决方案_简单_前端开发者...

    缓存对于前端页面来说,是加速页面加载的利器之一,但也同时带来了很多问题,比如新版本发布之后,怎么替换客户端上的缓存文件呢?大家一般的的解决方案主要有以下几种形式, 一般情况 1.添加版本号,在静态 l ...

  6. js打开服务器缓存文件夹路径,浅谈微信页面入口文件被缓存解决方案

    缓存对于前端页面来说,是加速页面加载的利器之一,但也同时带来了很多问题,比如新版本发布之后,怎么替换客户端上的缓存文件呢?大家一般的的解决方案主要有以下几种形式, 一般情况 1.添加版本号,在静态资源 ...

  7. Linux TCP server系列(4)-浅谈listen与大并发TCP连接

    背景: 服务器在调用listen和accept后,就会阻塞在accept函数上,accpet函数返回后循环调用accept函数等待客户的TCP连接.如果这时候又大量的用户并发发起connect连接,那 ...

  8. linux c控制进程并发量,浅谈Linux环境下并发编程中C语言fork()函数的使用

    由fork创建的新进程被称为子进程(child process).fork函数被调用一次,但返回两次.子进程的返回值是0,而父进程的返回值则是新进程的进程ID.将子进程ID返回给父进程的理由是:因为一 ...

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

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

  10. 烂大街的缓存穿透、缓存击穿和缓存雪崩,你真的懂了?

    前言 对于从事后端开发的同学来说,缓存已经变成的项目中必不可少的技术之一. 没错,缓存能给我们系统显著的提升性能.但如果你使用不好,或者缺乏相关经验,它也会带来很多意想不到的问题. 今天我们一起聊聊如 ...

最新文章

  1. GitHub分享《深度学习500问》优质资源
  2. 一席-赵立平-大树细菌
  3. CSS3颜色渐变模式
  4. 新概念0820:我只有一种生活
  5. html 动态调用php文件,html静态页面调用php文件的方法
  6. Java整合Spring发送邮件
  7. Visual Paradigm中文乱码
  8. C++:定义头文件/定义命名空间
  9. 分析Vector、ArrayList、Hashtable、HashMap数据结分享一下
  10. 微波遥感SNAP(一)——基于Sentinel-1雷达数据重建数字高程模型
  11. java2wsdl_Java2WSDL之java实现
  12. 跨境电商自建独立站CMS
  13. orbslam2+azure kinect DK稠密重建
  14. vi: 未找到命令_vi技巧和窍门:十个很棒的命令一定会给您的朋友留下深刻的印象...
  15. xcode打包IPA(完整详细图文)
  16. npm i 和 npm i -S有什么区别吗?
  17. 计算机应用技术一班班徽,1班班徽设计图片大全欣赏
  18. 会声会影2022测试新版本号V25.0.0.373
  19. 毕业设计之基于协同过滤算法的电影推荐系统设计(一) - 项目简介
  20. fidder classic 界面介绍

热门文章

  1. 初识dokuwiki
  2. Gdcm源码编译with python wrap详解
  3. git push ! [remote rejected] master -> master (pre-receive hook declined)
  4. Python3 正则表达式学习
  5. 亚马逊首席科学家 李沐:工作五年反思
  6. 推荐 | 自然语言处理、计算机视觉等机器学习实战项目练手平台
  7. 75道常见AI面试题,看看你的知识盲点在哪?(附解析,包括机器学习、深度学习、苹果Google面试等)...
  8. 20200318_抓取51job招聘数据存数据库
  9. 深度学习2.0-15.随机梯度下降之梯度下降简介
  10. [论文笔记]R-NET: MACHINE READING COMPREHENSION WITH SELF-MATCHING NETWORKS