【Redis进阶】缓存设计模式

server/2024/9/23 11:19:08/

目录

Cache Aside(旁路缓存)模式

概念

读操作流程如上图所示

写操作流程如上图所示

代码示例

总结

Read-Through 模式

概念

操作流程:

优点:

Write-Through 模式

概念

操作流程:

优点:

Write-Behind(Write-Back)模式

概念

操作流程:

优点:

缺点:

总结


缓存设计模式是指将缓存作为系统架构的一部分,通过特定的设计模式来优化数据访问的效率和性能。

Cache Aside(旁路缓存)模式

概念

Cache Aside模式是最常见的缓存设计模式,又称为Lazy Loading(延迟加载)模式。应用程序直接控制缓存和数据库的交互,数据的加载和更新由应用程序显式的管理。

读操作流程如上图所示

  1. 应用程序先从缓存中读取数据。
  2. 如果缓存中存在(命中),则返回数据。
  3. 如果缓存中不存在(未命中),则从数据库中读取数据,将数据写入缓存中,并返回数据。

写操作流程如上图所示

  1. 应用程序先更新数据库中的数据。
  2. 然后删除缓存中的旧数据(或者直接更新缓存)。

代码示例

// 伪代码示例
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模式将缓存的加载逻辑封装在缓存层,由缓存系统负责从数据库中记载数据。这种模式对于开发者透明,应用程序只需要与缓存交互。

操作流程

  1. 应用程序从缓存中读取数据。
  2. 如果缓存命中,则返回数据。
  3. 如果缓存未命中,则由缓存系统自动从数据库中加载数据,并写入缓存,然后返回数据。

在上图中,红色框线内的流程都由缓存自己操作,不再由应用层处理。

// 伪代码示例
public String getData(String key) {// 缓存系统内部封装了数据加载逻辑return cache.get(key);
}

优点

  • 简化了应用程序的代码逻辑,开发者只需关心缓存的使用。

Write-Through 模式

概念

在Write Though模式下,是由缓存配置一个写模块,应用层更新数据时,由缓存去更新数据库。同时,当缓存命中时,写缓存和写数据库这两个操作在一个事务中完成,保证同时成功:

操作流程

  1. 应用程序更新数据时,首先写入缓存
  2. 缓存系统会同步将数据写入数据库,确保数据一致性。
// 伪代码示例
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的最大特点。

操作流程

  1. 应用程序更新数据时,首先写入缓存
  2. 缓存系统会在后台异步批量将数据写入数据库。
// 伪代码示例
public void updateData(String key, String value) {cache.set(key, value);// 数据库更新在后台异步进行asyncUpdateDb(key, value);
}

优点

  • 应用层操作只写缓存,速度非常快。
  • 缓存在异步地写数据库时,会将多个I/O操作合并为一个,减少I/O次数。

缺点

  • 可能导致数据丢失,如果缓存崩溃或数据库写入失败。
  • 复杂度高

总结

缓存设计模式在分布式系统中起着至关重要的作用,它们帮助开发者在不同的业务场景下有效管理缓存,提高系统的性能和响应速度。根据具体的需求和场景,开发者可以选择适合的缓存设计模式,以确保系统的高效和稳定。


http://www.ppmy.cn/server/100453.html

相关文章

基于Python的上市公司年报数字化词频统计:深入解析与实战

基于Python的上市公司年报数字化词频统计:深入解析与实战 随着数字化转型的不断深入,各行各业纷纷利用数据分析技术获取竞争优势。上市公司的年报作为重要的信息披露文件,包含了大量的文字数据。通过文本分析技术,特别是词频统计,可以有效地挖掘出其中隐含的趋势和关键信…

重写的介绍

一、基本介绍 1、基本介绍 重写又称为覆盖(override),即子类继承父类的属性和方法后,根据业务需求,再重新定义同名的属性或方法 2、案例演示 二、练习 class Person:nameNoneageNonedef __init__(self,name,age):self.namenameself.ageage…

Kafka系列之:Dead Letter Queue死信队列DLQ

Kafka系列之:Dead Letter Queue死信队列DLQ 一、死信队列二、参数errors.tolerance三、创建死信队列主题四、在启用安全性的情况下使用死信队列更多内容请阅读博主这篇博客: Kafka系列之:Kafka Connect深入探讨 - 错误处理和死信队列一、死信队列 死信队列(DLQ)仅适用于接…

C语言基础学习:数组与常见数组排序算法

在C语言中数组是一种基本的数据结构,用于存储相同类型的数据元素的集合,数组中的每个数据元素都可以通过索引(或下标)来访问。 索引通常是从0开始的整数,在C语言中,数组可以是任何数据类型,包括…

机器学习-集成学习

集成学习 集成学习1. 学习分类2. Adaboost算法3. GBDT 算法4. XGBBoost算法 集成学习 """ 概述是机器学习的一种思想, 它通过多个模型的组合形成一个精度更高的模型, 参与组合的模型称为 弱学习器(基学习器) """1. 学习分类 """…

【博主推荐】HTML5新闻,博客,官网网站源码文章瀑布流+详情页面

文章目录 1.设计来源1.1 主界面1.2 文章详情界面1.3 联系我们界面1.4 关于我们界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 【博主推荐】:前些天发现了一个巨牛的人工智能学习网站&…

掌握命令的艺术:在JavaScript中运用命令模式

标题:掌握命令的艺术:在JavaScript中运用命令模式 引言 在软件开发中,设计模式是解决常见问题的成熟模板。命令模式(Command Pattern)是其中之一,它将请求封装为一个对象,从而允许用户使用不同…

Unity转Unreal5从入门到精通之如何实现一个简单的AI寻路

前言 我们今天使用最基础的引擎知识,来给大家创建一个简单的AI,可以追踪目标,攻击目标。 使用Unity类比的话,就是一个怪物预制体,放到了寻路上,当他视野看到目标后,就一直追踪目标,…