首页 > 数据库 >【Redis进阶】缓存设计模式

【Redis进阶】缓存设计模式

时间:2024-08-11 14:27:57浏览次数:18  
标签:缓存 进阶 数据库 Redis value Write key 设计模式 String

目录

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次数。

缺点

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

总结

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

标签:缓存,进阶,数据库,Redis,value,Write,key,设计模式,String
From: https://blog.csdn.net/2401_83045332/article/details/141037113

相关文章

  • Android14音频进阶调试之命令播放mp3/aac非裸流音频(八十)
    简介:CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!新书发布:《Android系统多媒体进阶实战》......
  • springboot整合redis
    第一部分:redis的下载安装百度网盘下载:通过百度网盘分享的文件:Redis-x64-5.0.14.zip链接:https://pan.baidu.com/s/1GEQj4p0l4fy1DzwCIknpRg?pwd=qokq 提取码:qokq --来自百度网盘超级会员V5的分享第二部分:安装(1)双击打开软件(2)点击next(3)点击next(4)更改路径,点击next......
  • 深入了解HTML链接:从基础到进阶——WEB开发系列06
    超链接是互联网中最有趣的创新之一,自互联网诞生起,它们就一直是互联网的一个核心特性,使网络成为一个互联的系统。超链接允许我们将文档连接到其他文档或资源,甚至是文档中的特定部分。通过一个简单的网址,可以提供应用程序。几乎所有网络内容都可以被转换为链接,点击或激活这些超链......
  • 节假日配置初始化 redis缓存方案及@PostConstruct注解,Cache方案GuavaUtils.java工具类
    节假日配置初始化redis缓存方案及@PostConstruct注解,Cache方案GuavaUtils.java工具类启动报错:本机,在jenkins上面没有报错?包括嵌套的注入Beanjava静态代码块和spring@value等注解注入顺序https://www.cnblogs.com/oktokeep/p/15530697.html/***节假日配置初始化redis缓存......
  • 01 NoSQL之Redis配置与优化
    目录1.1Redis介绍1.1.1关系数据库与非关系型数据库1.关系型数据库2.非关系型数据库3.非关系型数据库产生背景(1) Highperformance--对数据库高并发读写需求(2) HugeStorage--对海量数据高效存储与访问需求(3) HighScalability&&HighAvailability--对数......
  • Redis8-秒杀优化
    秒杀思路之前: Redis优化: 基于Redis完成秒杀资格判断需求:新增秒杀优惠券的同时,将优惠券信息保存到Redis中基于Lua脚本,判断秒杀库存、一人一单,决定用户是否抢购成功如果抢购成功,将优惠券id和用户id封装后存入阻塞队列开启线程任务,不断从阻塞队列中获取信息,实现异......
  • Redis5-缓存
    目录什么是缓存添加Redis缓存缓存更新策略三种策略数据库和缓存不一致的解决方案缓存穿透缓存雪崩缓存击穿缓存工具封装什么是缓存缓存是数据交换的缓冲区(Cache),是存贮数据的临时地方,一般读写性能较高多级缓存:浏览器缓存:主要是存在于浏览器端的缓存应用层缓存:可以......
  • Linux基于Redis实现短地址服务
    一、应用场景为什么要使用短地址服务,具体使用的业务场景如下:URL压缩,把原始长地址压缩成短地址,便于文本长度限制的场景使用(短信、社交网络、网络营销)    —营销短信有字数限制,链接太长会影响短信内容的条数(涉及到费用问题)。    — 相对于长链接,短链接更......
  • C语言进阶(6)
    1.结构体类型的声明和初始化结构体是一堆数据类型的集合体(与数组不同的是它可以是不同的数据类型)。结构体声明的是一个图纸,并不向内存申请空间,只有在设置变量的时候我们才进行划分空间给变量。结构体的变量数据类型可以理解成struct(结构体名),在初始化时我们就要牢记这个原则。......
  • Midjourney进阶-创建与管理自己的专属参数
    ​前言/introduction如题,这篇我们要学会创建与管理自己的专属参数。这里的参数指的是提示词尾缀添加的用于控制图片生成尺寸、模型、风格等参数,如:--ar+空格+数值,--s+控股+数值/preferoptionset(创建专属参数)用途:创建一个专属参数,也就是自己设定一个符号来代表(代替......