文档章节

缓存失效竟然可以这么解决?

_夜枫
 _夜枫
发布于 2017/06/19 13:54
字数 973
阅读 1
收藏 0

原文链接

 

 

数据传输提供的数据订阅功能,可以在不影响业务的情况下,实现简单、可靠的缓存失效逻辑。这种缓存失效机制为阿里巴巴多年架构优化沉淀下来的经验,下面我们一起来看数据订阅究竟怎么实现这种机制。

传统缓存失效策略

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

在上图中,大家可以看到,用户的更新数据直接持久化到DB, 业务读请求直接请求缓存数据,所以业务需要解决缓存失效问题,即解决因为数据变更导致缓存中的数据失效的问题。 目前业务解决缓存失效问题的解决方法一般是业务实现DB、缓存双写。通过业务双写解决缓存失效,存在如下的问题:

  1. 代码侵入性比较强,需要双写两份存储,任何对DB的数据变更,都需要同时更新缓存,代码层
  2. 面后期可维护程度不高
  3. 用户请求线程里同步调用缓存,对缓存存在强以来,遇到缓存超时等异常时,没有办法做到有效的重试,遇到异常给用户返回系统错误、操作失败等信息,严重影响用户体验
  4. 用户请求线程里同步完成DB、缓存双写,变更请求链路长,访问延迟大,影响用户体验

RDS数据订阅消费,轻松解决缓存失效

在阿里巴巴内部同样也遇到了缓存失效的问题,随着业务架构得不断调整优化,我们已经沉淀出一套高可靠、极优雅得缓存失效架构。即通过数据传输提供的数据订阅功能,异步获取DB(例如公共云上的RDS)的增量数据,根据增量数据进行缓存失效。具体的架构类似下图:

在这个架构里面,缓存更新流程如下:

  1. 业务完成DB更新后即返回请求
  2. 数据订阅通过日志解析方式实时解析并订阅DB的增量更新数据,当发现DB有数据更新时,将增量数据推送给下游消费者
  3. 下游消费业务一旦接收到增量更新数据,即调用消费线程进行缓存更新

至此完成整个缓存更新过程。

从上面的缓存失效流程,可以看出这种缓存失效机制:

  1. 更新路径短,延迟低: 缓存失效为异步流程,业务更新DB完成后直接返回,不需要关心缓存失效流程,整个更新路径短,更新延迟低
  2. 应用简单可靠:应用无需实现复杂双写逻辑,只需启动异步线程监听增量数据,更新缓存数据即可
  3. 应用更新无性能消耗:因为数据订阅是通过解析DB的增量日志来获取增量数据,获取数据的过程对业务、DB性能无损

原文链接

 

本文转载自: http://click.aliyun.com/m/23521/

_夜枫
粉丝 10
博文 506
码字总数 0
作品 0
朝阳
后端工程师
私信 提问
IE浏览器因缓存问题未能成功向后端发送请求的几个解决办法

这段时间前后端联调,解决IE、谷歌等浏览器兼容问题,真是让人有点焦头烂额,各种奇葩问题层出不穷,旧问题刚去,新麻烦又来,其中尤其以IE浏览器缓存的问题最多。有若干次都是因为这个缓存,...

涂宗勋
2016/05/09
365
0
SpringCloud服务的平滑上下线

吐槽: 以前都是手撸RPC,最近接触 SpringCloud ,深感痛心。主要有以下几点: 1)代码量巨大,找BUG时间长,超级复杂的设计 2)版本管理混乱,经常出现莫名其妙的配置错误(所以2.0是打死不...

Java干货分享
2018/09/29
0
0
缓存系统中面临的雪崩/穿透/一致性问题

计算机科学中有两件难事:缓存失效和命名 – Phil Karlton From Martin Fowler : TwoHardThings 缓存系统一定程度上极大提升系统并发能力,但同样也增加额外技术考虑因素,下面针对缓存系统设...

架构师springboot
02/13
0
0
缓存相关——缓存穿透、缓存并发、缓存失效、缓存预热、缓存雪崩、缓存算法

一、缓存穿透 我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存...

空云万里晴
2016/06/16
1K
0
Redis系列十:缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级

一、缓存雪崩 缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求...

Forande
2018/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库

数据库架构 数据库架构可以分为存储文件系统和程序实例两大块,而程序实例根据不同的功能又可以分为如下小模块。 1550644570798 索引模块 常见的问题有: 为什么要使用索引 什么样的信息能成...

一只小青蛙
今天
4
0
PHP常用经典算法实现

<? //-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ( $low <= $high){ $mid = int......

半缘修道半缘君丶
昨天
5
0
GIL 已经被杀死了么?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/8KvQemz0SWq2hw-2aBPv2Q 花下猫语: Python 中最广为人诟病的一点,大概就是它的 GIL 了。...

豌豆花下猫
昨天
5
0
git commit message form

commit message一般包括3部分:Header、Body、Footer。 <type>(<scope>):<subject>blank line<body>blank line<footer> header是必需的,body、footer可以省略。 header中type、subject......

ninjaFrog
昨天
5
0
聊聊Elasticsearch的CircuitBreakerService

序 本文主要研究一下Elasticsearch的CircuitBreakerService CircuitBreakerService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/indices/breaker/CircuitBreakerService.ja......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部