服务器端缓存失效的应对方法经验总结

所属分类: 网站运营 / 建站经验 阅读数: 207
收藏 0 赞 0 分享

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

复制代码
代码如下:

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。目前云用户的业务架构一般如下图:
2016621105005137.png (868×425)

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

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

小结
数据订阅功能为阿里云数据传输提供的一种数据分发方式。通过数据订阅实现的缓存失效策略,让业务更新更快捷,让业务逻辑更简单、更可靠。
数据订阅只是数据传输提供的一种传输方式,除数据订阅之外,数据传输还提供了数据实时同步,不停服迁移等多种传输能力,如需了解数据传输更多详情,请猛击数据传输。

更多精彩内容其他人还在看

空手套白狼:说说招投标网站的一些内幕 掌握资源的网站远比内容原创更重要

我非常欢迎这类文章的投稿,并会做传播,作者是一位建筑公司的经理,会通过互联网与大量招标类网站有接触,并通过自己的经历告诉了我们这些网站的内幕,通过本文可以了解到:掌握资源的网站远比内容原创更重要
收藏 0 赞 0 分享

百度站长平台:站点整改反馈功能即将上线

百度站长平台今日发布公告表示即将推出站点整改反馈功能,即若站长网站内容存在质量或是作弊问题,百度站长平台会将相关问题告知站长。若能在规定时间内修正,网站可有一次避免被惩罚的机会
收藏 0 赞 0 分享

建站经验:网站建设公司发展必备的22条商规

22条商规,是一本被神话了的商业著作,其实它翻来覆都在讲一个道理:成为你行业的标杆,然后一切你说了算。记得有位朋友跟我说,22商规其实只有最后一条定律是最重要的,其他的都是空谈。不过,本文希望能站在建站公司的角度重新解读,不当之处也多情谅解。
收藏 0 赞 0 分享

虚拟主机安装Dropbox备份网站的教程

虽然目前从国内访问Dropbox有小小困难,但是从国外访问还是正常的,对于拥有国外Linux虚拟主机的用户,可能会遇到这样的需求,就是如何将国外虚拟主机上的网站备份到Dropbox上,下面我以Dreamhost为例介绍一下备份的方法
收藏 0 赞 0 分享

站长再谈博客,理性、务实、交流是本质

如今大家都迷恋着资讯站、小说站、电商站的经营,已经很少有人再去关心所谓的博客了。还记得09年左右,独立博客迎来自身发展的黄金时期,涌现了牟长青、一格电、卢松松、月光博客等一系列知名博客,而这其中卢松松博客也已经实现了突破发展,向着平台继续前进
收藏 0 赞 0 分享

关于网站备案的44个问题和经验总结

这篇文章主要介绍了关于网站备案的44个问题和经验总结,这些问题是在备案过程中经常遇到的,需要的朋友可以参考下
收藏 0 赞 0 分享

企业建站注意事项:黑心建站公司的陷阱-域名所有者

这篇文章主要介绍了企业建站注意事项:黑心建站公司的陷阱-域名所有者,建站时购买的域名持有者一定要是息的资料,否则等着被坑吧,需要的朋友可以参考下
收藏 0 赞 0 分享

你赚到钱了吗?站长们之所以赚不到钱是因为缺乏这些思路

我们有没有找到问题的根源,我想这样的问题根源不在于个人的能力,而在于自己的思维和策略。那么,发现了问题根源,我们用什么样的方法去解决,这才是最重要的,也是大家最想知道的事情。今天,我就根据自己的一些想法,给大家分享一下解决办法
收藏 0 赞 0 分享

从“郭美美赌球被抓”这事件来谈谈百度搜索的用户体验

最近郭美美又火了一把,而且这把火并不好过,让她欠债2.6亿元,并且被带到了自己最不愿去的地方-警察局“做客”。今天本文就和大家一起从从“郭美美赌球被抓”这事件来谈谈百度搜索的用户体验
收藏 0 赞 0 分享

站长必看:竞价只靠钱来砸实在是太傻了!

虽然站长圈对于百度的这个商业行为十分厌恶,但是从自身利益上讲,我们还要遵守百度的游戏规则。不过,要说到效果,竞价的确有一定的话语权,有些专门竞价的站长的确是从中受益不少,只不过钱砸的太狠了
收藏 0 赞 0 分享
查看更多