站长之家,中国草根站长新闻、建站经验、素材资源交流平台!
分类导航

站长新闻|网站运营|建站经验|网站优化|站长资源|站长源码|

服务器之家 - 站长之家 - 建站经验 - 服务器端缓存失效的应对方法经验总结

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

2020-05-23 20:32开源中文社区 建站经验

在Redis等缓存工具普遍使用的今天,缓存失效问题会对用户体验产生一定影响,这里我们根据阿里云的数据订阅功能实现,来谈一谈服务器端缓存失效的应对方法经验总结

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

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性能无损

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

延伸 · 阅读

精彩推荐
  • 建站经验网站更换服务器有什么影响

    网站更换服务器有什么影响

    在我们日常维护 网站 的时候,可能会由于网站打开慢或者网站被攻击, 服务器 内部故障或者外部的原因都会导致我们的网站出现打不开的现象,有时我们...

    东德SEO4182020-12-04
  • 建站经验关于站内搜索分析的重要性和方法

    关于站内搜索分析的重要性和方法

    SEO!PPC!内容规划!转化率啊!?当我们殚精竭力、勤勤恳恳劳作,加以虔诚的态度,拜请到各位访客,可90%的人都洒脱的挥一挥衣袖不带走一 片云彩,让咱们这...

    建站教程网9312021-06-09
  • 建站经验腾讯高手都在学的「感知性模式设计」是什么?

    腾讯高手都在学的「感知性模式设计」是什么?

    如果沿用到互联网方面的设计,那么感知性模式的例子可能包括:文字信息、版式、配色、布局、插图、图标、形状纹理、间距、交互或者动画等等,这些...

    优设7802021-08-03
  • 建站经验个人站长怎样选择做网站

    个人站长怎样选择做网站

    做网站是为了赚钱,我相信没人会反对,网站有了流量,才能赚钱,本篇文章将为大家介绍做站方向的取舍,使流量来的快,竞争小。 ...

    建站教程网5232020-09-03
  • 建站经验网店运营要学会两条腿走路:网店设计和营销

    网店运营要学会两条腿走路:网店设计和营销

    百度重新收录淘宝店,对于运营淘宝店的店主们应该是一个好消息...

    开店教程网3162020-08-21
  • 建站经验网站中了木马怎么办

    网站中了木马怎么办

    网站中了木马怎么办?网站被黑中了木马也不算是比较稀奇的事情,不过大多数人是遇不到的,一般出现这种情况的网站都是一些比较高端的企业网站,或者...

    站长之家4802021-09-24
  • 建站经验网站建设初期的SEO优化定位

    网站建设初期的SEO优化定位

    根据 网站建设 的性质我们可以分为两种:一种是产品的商城,一种是做服务的网站。每一个网站在建设之前都会考虑行业的竞争对手的手法还有自身行业...

    站长之家9952021-01-28
  • 建站经验如何在百度知道发外链的技巧

    如何在百度知道发外链的技巧

    百度知道作为国内最大的互动问答平台,每天云集了数以千万计的访客,而且百度关键词搜索结果中,百度知道页面也有着不错的排名,这就让了不少站长...

    站长之家9192021-07-03