专栏|分布式缓存系列

简介: 分布式缓存

## 更新策略


缓存更新的策略主要分为三种:


- **Cache Aside Pattern(旁路缓存)**

- **Read/Write Through Pattern(读写穿透)**

- **Write Behind Caching Pattern(异步写入)**




**缓存使用场景**


**分布式系统中要么通过2PC、3PC或Paxos协议保证强一致性,要么就是拼命的降低并发时脏数据的概率**。缓存系统适用的场景就是非强一致性的场景,所以它属于CAP中的AP,只能做到BASE理论中说的**最终一致性**。异构数据库本来就没办法强一致,我们只是**尽可能减少不一致的时间窗口,达到最终一致性**。同时结合设置过期时间的兜底方案。




**缓存场景分析**


- 对于读多写少的数据,请使用缓存

- 为了保持数据库和缓存的一致性,会导致系统吞吐量的下降

- 为了保持数据库和缓存的一致性,会导致业务代码逻辑复杂

- 缓存做不到绝对一致性,但可以做到最终一致性

- 对于需要保证缓存数据库数据一致的情况,请尽量考虑对一致性到底有多高要求,选定合适的方案,避免过度设计




### Cache Aside(旁路缓存)


`Cache Aside(旁路缓存)` 是最广泛使用的缓存模式之一,如果能正确使用 `Cache Aside` 的话,能极大的提升应用性能,`Cache Aside`可用来读或写操作。`Cache Aside`的提出是为了尽可能地解决缓存与数据库的数据不一致问题。


#### Read Cache Aside


`Cache Aside` 的读请求流程如下:



- **读的时候,先读缓存,缓存命中的话,直接返回数据**

- **缓存没有命中的话,就去读数据库,从数据库取出数据,放入缓存后,同时返回响应**




#### Write Cache Aside


`Cache Aside` 的写请求流程如下:


![Cache-Aside写请求](Cache-Aside写请求.jpg)


- **更新的时候,先更新数据库,然后再删除缓存**




### Read/Write Through(读写穿透)


`Read/Write Through(读写穿透)` 模式中,服务端把缓存作为主要数据存储。应用程序跟数据库缓存交互,都是通过**抽象缓存层**完成的。


#### Read Through


`Read Through` 和 `Cache Aside` 很相似,不同点在于程序不需要再去管理从哪去读数据(缓存还是数据库)。相反它会直接从缓存中读数据,该场景下是缓存去决定从哪查询数据。当我们比较两者的时候这是一个优势因为它会让程序代码变得更简洁。`Read Through`的简要流程如下



- **从缓存读取数据,读到直接返回**

- **如果读取不到的话,从数据库加载,写入缓存后,再返回响应**




该模式只在 `Cache Aside` 之上进行了一层封装,它会让程序代码变得更简洁,同时也减少数据源上的负载。流程如下:





#### Write Through


`Write Through` 模式下的所有写操作都经过缓存,每次向缓存中写数据时,缓存会把数据持久化到对应的数据库中去,且这两个操作都在一个事务中完成。因此,只有两次都写成功才是最终写成功。用写延迟保证了数据一致性。当发生写请求时,也是由**缓存抽象层**完成数据源和缓存数据的更新,流程如下:


![Write-Through](Write-Through.png)


- **向缓存中写数据,并向数据库写数据**

- **使用事务保证一致性,两者都写成功才成功**




当使用 `Write Through `的时候一般都配合使用 `Read Through`。`Write Through `适用情况有:


- **需要频繁读取相同数据**

- **不能忍受数据丢失(相对 `Write Behind` 而言)和数据不一致**


**`Write Through` 的潜在使用例子是银行系统。**




### Write Behind(异步写入)


`Write Behind(异步写入,又叫Write Back)` 和 `Read/Write Through` 相似,都是由 `Cache Provider` 来负责缓存和数据库的读写。它们又有个很大的不同:`Read/Write Through` 是同步更新缓存和数据的,`Write Behind` 则是只更新缓存,不直接更新数据库,通过**批量异步**的方式来更新数据库。



这种方式下,缓存和数据库的一致性不强,**对一致性要求高的系统要谨慎使用**。但是它适合频繁写的场景,MySQL的**InnoDB Buffer Pool 机制**就使用到这种模式。如上图,应用程序更新两个数据,Cache Provider 会立即写入缓存中,但是隔一段时间才会批量写入数据库中。优缺点如下:


- **优点**:是数据写入速度非常快,适用于频繁写的场景

- **缺点**:是缓存和数据库不是强一致性,对一致性要求高的系统慎用

相关文章
|
12天前
|
存储 缓存 负载均衡
从零到一:分布式缓存技术初探
分布式缓存通过将数据存储在多个节点上,利用负载均衡算法提高访问速度、降低数据库负载并增强系统可用性。常见产品有Redis、Memcached等。其优势包括性能扩展、高可用性、负载均衡和容错性,适用于页面缓存、应用对象缓存、状态缓存、并行处理、事件处理及极限事务处理等多种场景。
36 1
|
7月前
|
存储 缓存 NoSQL
架构面试题汇总:缓存(2024版)
架构面试题汇总:缓存(2024版)
|
7月前
|
存储 缓存 监控
架构面试题汇总(一)
架构面试题汇总(一)
|
7月前
|
缓存 NoSQL 测试技术
服务高可用秘籍:高性能 - 葵花宝典
随着企业产品业务不断扩大、用户量增加、功能需求复杂化,原有的系统架构逐渐无法满足高效运行、快速响应市场变化以及支持大规模并发访问等需求,在这种背景下,服务从单体应用架构,发展到资源隔离拆分多服务架构、负债均衡多集群架构,再到更细粒度的微服务容器编排架构,业务的增长不断促进架构的演进。本人有幸在刚进入互联网公司没几年就接触到相对大型的互联网产品的开发,从几十万、几百万到现在上千万 DAU,业务的增长不仅仅是对现有架构的挑战,更是推动技术创新和架构升级的动力。企业需要不断审视和调整其技术架构,以适应业务发展,保持竞争力,服务的部署架构以及开发者的技术认知,也跟随着高 QPS 场景不断的迭代升级。
55 0
|
消息中间件 缓存 负载均衡
Redis 从入门到精通之高并发场景中的秒杀理论基础
要深入消息Redis 的高并发场景之前,我们需要先了解一下高并发场景和秒杀理论基础。高并发场景是指在短时间内有大量用户同时访问同一资源,例如网站、应用程序、数据库、服务器等。在高并发场景下,系统需要处理大量的请求,并且需要保证请求的响应时间和系统的稳定性。
176 15
|
存储 缓存 算法
第15章 内存数据库系统——复习笔记
第15章 内存数据库系统——复习笔记
|
消息中间件 存储 缓存
分布式技术相关专栏索引
分布式技术相关专栏索引
66 0
|
canal 缓存 NoSQL
关于项目点赞问题的高并发解决
采用的技术方案是redis解决的
592 0
|
存储 缓存 运维
|
消息中间件 canal 缓存