在用缓存的时候,基本上会通用遇到以下三个问题:

  • 缓存穿透
  • 缓存并发
  • 缓存失效

一、缓存穿透

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

我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询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的压力凸显。这个没有完美解决办法,但可以分析用户行为,尽量让失效时间点均匀分布。

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

四、提问汇总

1、问题1:

如何解决DB和缓存一致性问题?

答:当修改了数据库后,有没有及时修改缓存。这种问题,以前有过实践,修改数据库成功,而修改缓存失败的情况,最主要就是缓存服务器挂了。而因为网络问题引起的没有及时更新,可以通过重试机制来解决。而缓存服务器挂了,请求首先自然也就无法到达,从而直接访问到数据库。那么我们在修改数据库后,无法修改缓存,这时候可以将这条数据放到数据库中,同时启动一个异步任务定时去检测缓存服务器是否连接成功,一旦连接成功则从数据库中按顺序取出修改数据,依次进行缓存最新值的修改。

2、问题2:

问下缓存穿透那块!例如,一个用户查询文章,通过ID查询,按照之前说的,是将缓存的KEY预先设置一个值,,如果通过ID插过来,发现是预先设定的一个值,比如说是“&&”,那之后的继续等待访问是什么意思,这个ID什么时候会真正被附上用户所需要的值呢?

答:我刚说的主要是咱们常用的后面配置,前台获取的场景。前台无法获取相应的key,则等待,或者放弃。当在后台配置界面上配置了相关key和value之后,那么以前的key &&也自然会被替换掉。你说的那种情况,自然也应该会有一个进程会在某一个时刻,在缓存中设置这个ID,再有新的请求到达的时候,就会获取到最新的ID和value。

3、问题3:

其实用redis的话,那天看到一个不错的例子,双key,有一个当时生成的一个附属key来标识数据修改到期时间,然后快到的时候去重新加载数据,如果觉得key多可以把结束时间放到主key中,附属key起到锁的功能。

答:这种方案,之前我们实践过。这种方案会产生双份数据,而且需要同时控制附属key与key之间的关系,操作上有一定复杂度。

4、问题4:

多级缓存是什么概念呢?

答:多级缓存就像我今天之前给大家发的文章里面提到了,将ehcache与redis做二级缓存,但同样会存在一致性问题,如果我们需要强一致性的话,缓存与数据库同步是会存在时间差的,所以我们在具体开发的过程中,一定要根据场景来具体分析,二级缓存更多的解决是,缓存穿透与程序的健壮性,当集中式缓存出现问题的时候,我们的应用能够继续运行。

关注我,后续更多干货奉上!

PS:点击左下角“了解更多”,一个神秘的链接

二级缓存失效_缓存核心技术:缓存穿透、缓存并发、缓存失效之思路变迁相关推荐

  1. 缓存穿透、并发和失效的解决方案

    我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 缓存穿透 注:上面三个图会有什么问题呢? 我们在项目中使用缓存通常都是先检查缓 ...

  2. mysql缓存怎么防止缓存击穿_带你搞明白什么是缓存穿透、缓存击穿、缓存雪崩...

    目录什么是缓存 人在地上走,锅从天上来 缓存穿透什么是缓存穿透 解决方案将空数据存入缓存 布隆过滤器 缓存击穿什么是缓存击穿 解决方案自动更新 定时刷新 程序加锁 缓存雪崩什么是缓存雪崩 解决方案随机 ...

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

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

  4. 最佳实践 缓存穿透,瞬间并发,缓存雪崩的解决方法

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

  5. apache缓存清理_深挖 Mybatis 源码:缓存模块

    作者:AmyliaY 出自:Doocs开源社区 原文:my.oschina.net/doocs/blog/4549852 MyBatis 中的缓存分为一级缓存.二级缓存,但在本质上是相同的,它们使用的 ...

  6. 查看mysql缓存命中_【转】MySQL如何检查缓存命中

    MySQL如何检查缓存命中 MySQL如何检查缓存命中 How MySQL Checks for a Cache Hit MySQL检查缓存命中的方式相当简单快捷.缓存就是一个查找表(Lookup T ...

  7. 滚动后mouseleave失效_发动机上的三点接触球轴承失效案例

    点击蓝字获取更多精彩信息 轴承的好坏会直接影响到发动机的正常使用,发动机的高压转子前支点采用的是三点接触球轴承,下面中华轴承网(简称:华轴网)分享是有关三点接触球轴承的失效案例. 1.三点接触球轴承失 ...

  8. python缓存技术_如何写出高性能Python之缓存的应用?

    缓存有什么作用? 能看到这篇文章的同学,应该都对缓存这个概念不陌生,CPU中也有一级缓存.二级缓存和三级缓存的概念.缓存可以解决哪些问题?我们直接把网上的一段话放上来: 性能--将相应数据存储起来以避 ...

  9. 小程序获取openid保存缓存吗_微信小程序把openid放到缓存里

    在微信小程序里面,openid只能通过wx.login获取,如果在多个页面使用的话需要传递openid,比如说: wx.navigateTo({ url: 'main/main?openid=' + ...

  10. 第一次失效_爱搞机官方出品!永不失效的看片神器,第一次使用就爱上了

    大噶好,我系波老师.今天必须推荐这款神器!在往期的推送中,关于看片神器总是担心会被和谐,今天这款神器光听名字就感觉很霸气,甚至永久也不会被封杀.它不仅满足我们看直播的需求,而且还没有任何广告. Chi ...

最新文章

  1. C# 温故而知新:Stream篇(二)
  2. 移动互联网改变商业环境:商品的颠覆
  3. C_functions
  4. 红帽技术开放日:参与开源社区不只有贡献代码这一种方式
  5. 图像处理之简单脸谱检测算法
  6. vs2010 失效后的解决办法
  7. c语言结构体与共同体课件,《结构体与共同体》PPT课件.ppt
  8. MySQL视图附带例子详解(小白都能懂哦)
  9. Android--音乐播放器
  10. 黑马公开课——运行原理与GC学习笔记
  11. linux 打包库文件,Linux的文件的打包(tar方法)
  12. 计算机与交互式白板通过USB数据线,选购交互式电子白板注意哪些事项【详细介绍】...
  13. gdb coredump oracle,GDB + CoreDump 调试记录
  14. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_09-freemarker基础-内建函数
  15. css-图片模糊处理
  16. 机器人学从理论、设计到建模仿真零基础入门教程(硬核、偏零基础)
  17. C#使用itextsharp生成PDF文件含页脚页眉
  18. appium-滑动、拖动操作
  19. eureka多台注册中心_spring cloud eureka集群,注册中心再添加一台服务器
  20. 红蜘蛛5屏幕测试软件,红蜘蛛5校色仪怎么用?显示器校色及测试色域和色彩精准度详细教程(2)...

热门文章

  1. 超过3000赞的「机器学习路线图」,教你升级打怪全攻略
  2. 对于销售,什么是你应该考虑的最重要事情?
  3. 即时通讯软件线上系统维护工作总结
  4. 浅谈智能电网的建设 软件开发
  5. 『常识』如何防止静电?
  6. 163相册密码破解秘诀
  7. 在Visual C++中用ADO进行数据库编程(下)
  8. python中swap函数_python swap
  9. 新冠患者样本单细胞测序文献汇总
  10. c语言中 a6,C语言中的32个关键字