【Redis进阶】缓存设计模式

news2024/9/21 18:36:28

目录

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.coloradmin.cn/o/2042389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【摄影后期技巧】连拍多张图像中快速找到最清晰的图像——Python代码实现

手持相机高速连拍过程,当快门速度不够高时不可避免出现模糊帧,通过肉眼去从多张连拍图像中找到最清晰的帧是比较费事的,可通过代码自动去计算最清晰的图像,省去挑选图像的麻烦事,同时也可以将模糊图像剔除掉&#xff0…

【Python学习-UI界面】PyQt5 小部件11-Dialog Button Box 确认与取消框

样式如下: 一个预配置的对话框,带有一个文本字段和两个按钮,OK和取消。在用户单击OK按钮或按下Enter键后,父窗口会在文本框中收集输入。 用户输入可以是数字、字符串或列表中的项。还会显示一个提示用户应该做什么的标签。 常用方法如下&…

详细介绍 Vue3 的 watch 和 watchEffect

在 Vue 3 中,watch 和 watchEffect 都是用于响应式地监听数据变化的工具,但它们有不同的使用场景和工作机制。 1. watch 1、概念 watch 是 Vue 3 提供的一个用于观察响应式数据变化并在数据发生变化时执行特定操作的工具。它通常用于执行副作用&#…

LeetCode 热题 HOT 100 (023/100)【宇宙最简单版】

【技巧】No. 0647 回文子串【中等】👉力扣对应题目指路 希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xff…

基于spring boot的疫情信息管理系统

TOC springboot255基于spring boot的疫情信息管理系统 绪论 1.1研究背景与意义 信息化管理模式是将行业中的工作流程由人工服务,逐渐转换为使用计算机技术的信息化管理服务。这种管理模式发展迅速,使用起来非常简单容易,用户甚至不用掌握…

CSC5812C 同步降压5V2.5A DC/DC车载充电方案

CSC5812C 是一款同步降压型的 DC/DC 变换器 IC ,CSC5812C输入电压为 8~30V ,可取得 2.5A恒定输出电流,开关频率 120kHz 左右,具有良好的瞬态响应和环路稳定性。CSC5812C 外围元器件极少,具有线补、过流保护和热保护功能…

Android全面解析之context机制(二): 从源码角度分析context创建流程(上)

前言 这篇文章从源码角度分析context创建流程。 在上一篇Android全面解析之Context机制(一) :初识context一文中讲解了context的相关实现类。经过前面的讨论,读者对于context在心中有了一定的理解。但始终觉得少点什么:activity是什么时候被创建的&…

IDEA终端无法打开,解决方法

检查终端路径: 确保你的系统终端路径被正确设置在你的开发环境或IDE的配置中。例如,在Windows上,这通常是cmd.exe、PowerShell或Git Bash的路径;在macOS或Linux上,这通常是/bin/bash、/bin/zsh等。 2.权限问题&#…

CTFSHOW 萌新 web13 解题思路和方法(利用?>提前结束语句)

点击题目链接,分析代码。发现相比上一关卡,增加过滤了分号。 此时,如果按照之前的方式构造url语句,发现由于分号的存在导致返回cmd error信息。 因为php中最后一行代码的结尾如果不接分号,也会被正常执行。 此时我们可…

Python 设计模式之享元模式

文章目录 从一个 MP3 案例谈起flyweight 模式解决flyweight pattern 的组件拆解定义与逐步实现完整代码 未讨论问题 享元模式( flyweight pattern)属于结构型设计模式,主要用于解决系统中大量创建同一个类的实例时导致的内存激增的问题&…

国产崛起,Solon:我们的性能是 Spring 的 300%

Solon 应用开发框架(java framework)。是从零开始构建,有自主的标准规范与开放生态。纯血国产。 追求: 更快、更小、更简单提倡: 克制、简洁、高效、开放、生态 相对于 Spring 应用开发框架。并发高 300%&#xff1b…

el-cascader多选的父子关联和父子不关联功能

公用html&#xff1a; <el-cascader v-model"data" :options"optionsData" :props"props" clearable> </el-cascader> 公用js变量&#xff1a; data () {return {// 绑定的数组data: [],// 绑定的选项数据optionsData: []} }, 公…

python自动化笔记:操作mysql数据库

操作mysql数据库常见方法 1、第三方库&#xff1a;pymysql1.1、安装pymysql1.2、连接数据库1.3、连接指定数据库1.4 创建数据库、创建表1.5、表中插入数据1.6、批量插入数据1.7、获取查询结果数据1.8、防sql注入&#xff0c;sql语句中一般用占位符传值 2、标准库 &#xff1a;m…

OpenCV图像处理——按最小外接矩形剪切图像

引言 在图像处理过程中&#xff0c;提取感兴趣区域&#xff08;ROI&#xff09;并在其上进行处理后&#xff0c;往往需要将处理后的结果映射回原图像。这一步通常涉及以下几个步骤&#xff1a; 找到最小外接矩形&#xff1a;使用 cv::boundingRect 或 cv::minAreaRect 提取感兴…

Jenkins默认工作目录修改及迁移(Windows)

问题描述 如果Jenkins安装时安在C盘&#xff0c;那么默认的空间就是C:\ProgramData\Jenkins.jenkins&#xff0c;git下拉的项目会在该目录的workspace下&#xff0c;造成C盘空间增大。网上方法倒是有&#xff0c;五花八门&#xff0c;我这里是Windows&#xff0c;是有更简单的…

前端工程化14-git merge 以及 git rebase。

rebase会把当前分支的 commit 放到公共分支的最后面,所以叫变基。就好像从公共分支又重新拉出来这个分支一样。 举例&#xff1a; 如果从 master 拉个feature分支出来,然后提交了几个 commit,这个时候刚好有人把他开发的东西合并到 master 了,这个时候 master 就比你拉分支的…

VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection

VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection Abstract 摘要部分&#xff0c;作者首先指出了3D点云中目标检测的重要性&#xff0c;在自动驾驶导航、家政机器人以及增强现实和虚拟现实等多个领域有重要的作用。然后&#xff0c;提到了现有方法的…

C语言实现多种快速排序

目录 1.概念 2.快速排序hoare版本 2.1基本思想 2.2解释相遇处的值为何一定小于key 2.3hoare版本快速排序的实现 3.快速排序挖坑法 3.1基本思想 3.2挖坑法快速排序的实现 4. 快速排序前后指针版本 4.1基本思想 4.2快速排序前后指针版本实现 5.快速排序非递归版本 …

Linux下如何使用Curl进行网络请求

在Linux系统上&#xff0c;Curl是一个非常强大的网络请求工具&#xff0c;可以用于发送各种类型的HTTP请求&#xff0c;并获取响应结果。它支持常见的HTTP方法&#xff0c;如GET、POST、PUT、DELETE等&#xff0c;还支持HTTPS、FTP等不同协议。Curl提供了丰富的参数选项&#x…