目录
缓存设计模式是指将缓存作为系统架构的一部分,通过特定的设计模式来优化数据访问的效率和性能。
Cache Aside(旁路缓存)模式
概念
Cache Aside模式是最常见的缓存设计模式,又称为Lazy Loading(延迟加载)模式。应用程序直接控制缓存和数据库的交互,数据的加载和更新由应用程序显式的管理。
读操作流程如上图所示
- 应用程序先从缓存中读取数据。
- 如果缓存中存在(命中),则返回数据。
- 如果缓存中不存在(未命中),则从数据库中读取数据,将数据写入缓存中,并返回数据。
写操作流程如上图所示
- 应用程序先更新数据库中的数据。
- 然后删除缓存中的旧数据(或者直接更新缓存)。
代码示例
// 伪代码示例
public String getData(String key) {
String value = redis.get(key);
if (value == null) {
value = db.get(key);
redis.set(key, value);
}
return value;
}
public void updateData(String key, String value) {
db.update(key, value);
redis.del(key); // 或者 redis.set(key, value);
}
总结
在Cache Aside中,应用层需要和缓存和数据库两个数据源打交道,这增加了应用层的复杂度,而Read/Write Through Pattern就是来解决这个问题的,在这两种模式下,应用层只需要将缓存作为主要数据源,不需要感知数据库,更新和读取的任务都交给缓存来处理。
Read-Through 模式
概念
Read-Through模式将缓存的加载逻辑封装在缓存层,由缓存系统负责从数据库中记载数据。这种模式对于开发者透明,应用程序只需要与缓存交互。
操作流程:
- 应用程序从缓存中读取数据。
- 如果缓存命中,则返回数据。
- 如果缓存未命中,则由缓存系统自动从数据库中加载数据,并写入缓存,然后返回数据。
在上图中,红色框线内的流程都由缓存自己操作,不再由应用层处理。
// 伪代码示例
public String getData(String key) {
// 缓存系统内部封装了数据加载逻辑
return cache.get(key);
}
优点:
- 简化了应用程序的代码逻辑,开发者只需关心缓存的使用。
Write-Through 模式
概念
在Write Though模式下,是由缓存配置一个写模块,应用层更新数据时,由缓存去更新数据库。同时,当缓存命中时,写缓存和写数据库这两个操作在一个事务中完成,保证同时成功:
操作流程:
- 应用程序更新数据时,首先写入缓存。
- 缓存系统会同步将数据写入数据库,确保数据一致性。
// 伪代码示例
public void updateData(String key, String value) {
cache.set(key, value);
db.update(key, value); // 缓存系统自动同步数据库
}
优点:
- 数据一致性强,避免了缓存与数据库不一致的问题。
Write-Behind(Write-Back)模式
概念
Write-Behind 模式 也称为 Write-Back 模式。与 Write-Through 模式不同,Write-Behind 模式将数据写入缓存后,不立即同步写入数据库,而是在后台异步批量更新数据库,这个异步写操作是Write-Behind的最大特点。
操作流程:
- 应用程序更新数据时,首先写入缓存。
- 缓存系统会在后台异步批量将数据写入数据库。
// 伪代码示例
public void updateData(String key, String value) {
cache.set(key, value);
// 数据库更新在后台异步进行
asyncUpdateDb(key, value);
}
优点:
- 应用层操作只写缓存,速度非常快。
- 缓存在异步地写数据库时,会将多个I/O操作合并为一个,减少I/O次数。
缺点:
- 可能导致数据丢失,如果缓存崩溃或数据库写入失败。
- 复杂度高
总结
缓存设计模式在分布式系统中起着至关重要的作用,它们帮助开发者在不同的业务场景下有效管理缓存,提高系统的性能和响应速度。根据具体的需求和场景,开发者可以选择适合的缓存设计模式,以确保系统的高效和稳定。
标签:缓存,进阶,数据库,Redis,value,Write,key,设计模式,String From: https://blog.csdn.net/2401_83045332/article/details/141037113