我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何解决服务器端缓存失效的问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何解决服务器端缓存失效的问题

这篇文章主要讲解了“如何解决服务器端缓存失效的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决服务器端缓存失效的问题”吧!

缓存失效情况举例
看下这个段伪代码:

代码如下:


local value = get_from_cache(key)
if not value then
   value = query_db(sql)
   set_to_cache(value, timeout = 100)
end
return value


看上去没有问题,在单元测试情况下,也不会有异常。
但是,进行压力测试的时候,你会发现,每隔100秒,数据库的查询就会出现一次峰值。如果你的cache失效时间设置的比较长,那么这个问题被发现的机率就会降低。
为什么会出现峰值呢?想象一下,在cache失效的瞬间,如果并发请求有1000条同时到了 query_db(sql) 这个函数会怎样?没错,会有1000个请求打向数据库。这就是缓存失效瞬间引起的风暴。它有一个英文名,叫 "dog-pile effect"。
怎么解决?自然的想法是发现缓存失效后,加一把锁来控制数据库的请求。具体的细节,春哥在lua-resty-lock的文档里面做了详细的说明,我就不重复了,请看这里。多说一句,lua-resty-lock库本身已经替你完成了wait for lock的过程,看代码的时候需要注意下这个细节。

传统缓存失效应对策略
为了提高业务访问速度,提升业务读并发,很多用户都会在业务架构中引入缓存层。业务所有读请求全部路由到缓存层,通过缓存的内存读取机制大大提升业务读取性能。缓存中的数据不能持久化 ,一旦缓存异常退出,那么内存中的数据就会丢失,所以为了保证数据完整,业务的更新数据会落地到持久化存储中,例如DB。目前云用户的业务架构一般如下图:
如何解决服务器端缓存失效的问题

在上图中,大家可以看到,用户的更新数据直接持久化到DB, 业务读请求直接请求缓存数据,所以业务需要解决缓存失效问题,即解决因为数据变更导致缓存中的数据失效的问题。 目前业务解决缓存失效问题的解决方法一般是业务实现DB、缓存双写。通过业务双写解决缓存失效,存在如下的问题:
代码侵入性比较强,需要双写两份存储,任何对DB的数据变更,都需要同时更新缓存,代码层面后期可维护程度不高
用户请求线程里同步调用缓存,对缓存存在强以来,遇到缓存超时等异常时,没有办法做到有效的重试,遇到异常给用户返回系统错误、操作失败等信息,严重影响用户体验
用户请求线程里同步完成DB、缓存双写,变更请求链路长,访问延迟大,影响用户体验
RDS数据订阅消费,轻松解决缓存失效
在阿里巴巴内部同样也遇到了缓存失效的问题,随着业务架构得不断调整优化,我们已经沉淀出一套高可靠、极优雅得缓存失效架构。即通过数据传输提供的数据订阅功能,异步获取DB(例如公共云上的RDS)的增量数据,根据增量数据进行缓存失效。具体的架构类似下图:
如何解决服务器端缓存失效的问题

在这个架构里面,缓存更新流程如下:
1.业务完成DB更新后即返回请求
2.数据订阅通过日志解析方式实时解析并订阅DB的增量更新数据,当发现DB有数据更新时,将增量数据推送给下游消费者
3.下游消费业务一旦接收到增量更新数据,即调用消费线程进行缓存更新
至此完成整个缓存更新过程。
从上面的缓存失效流程,可以看出这种缓存失效机制:
1.更新路径短,延迟低: 缓存失效为异步流程,业务更新DB完成后直接返回,不需要关心缓存失效流程,整个更新路径短,更新延迟低
2.应用简单可靠:应用无需实现复杂双写逻辑,只需启动异步线程监听增量数据,更新缓存数据即可
3.应用更新无性能消耗:因为数据订阅是通过解析DB的增量日志来获取增量数据,获取数据的过程对业务、DB性能无损

感谢各位的阅读,以上就是“如何解决服务器端缓存失效的问题”的内容了,经过本文的学习后,相信大家对如何解决服务器端缓存失效的问题这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何解决服务器端缓存失效的问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何解决服务器端缓存失效的问题

这篇文章主要讲解了“如何解决服务器端缓存失效的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决服务器端缓存失效的问题”吧!缓存失效情况举例看下这个段伪代码:代码如下:local v
2023-06-10

缓存穿透、缓存击穿、缓存雪崩、热点数据失效问题的解决方案

在我们的平常项目中多多少少会用到缓存,因为一些数据没必要每次查询都跑到数据库中查询。 1、缓存穿透         请求去查询一条不存在的数据,也就是缓存和数据库都查询不到这条数据,但每次请求都会打到数据库上去。         这种查询不存在数据的现象我们
缓存穿透、缓存击穿、缓存雪崩、热点数据失效问题的解决方案
2021-10-17

VueSPA如何解决浏览器缓存问题

这篇文章主要介绍了VueSPA如何解决浏览器缓存问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

关于缓存穿透,缓存击穿,缓存雪崩,热点数据失效问题的解决方案(转)

1.我们使用缓存时的业务流程大概为:当我们查询一条数据时,先去查询缓存,如果缓存有就直接返回,如果没有就去查询数据库,然后返回。这种情况下就可能出现下面的一些现象。2.缓存穿透2.1什么是缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的
关于缓存穿透,缓存击穿,缓存雪崩,热点数据失效问题的解决方案(转)
2017-06-16

如何解决Oracle服务丢失的问题?

解决Oracle服务丢失的问题Oracle数据库是众多企业和组织首选的关系型数据库管理系统,但在实际使用过程中,有时会遇到数据库服务丢失的情况,影响系统正常运行。本文将介绍如何解决Oracle服务丢失的问题,并给出具体的代码示例,帮助读者
如何解决Oracle服务丢失的问题?
2024-03-08

如何解决@Transactional遇到try catch失效的问题

这篇文章给大家分享的是有关如何解决@Transactional遇到try catch失效的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。@Transactional遇到try catch失效Springboo
2023-06-29

编程热搜

目录