当前位置: 首页 > news >正文

RedisMySQL 3种常用的缓存读写策略详解

以下是对三种缓存模式(Cache Aside、Read/Write Through 和 Write Behind)的更详细描述,包含在写入时读取时的具体操作步骤。

1. Cache Aside Pattern(旁路缓存模式)

读取时的操作步骤
  1. 请求数据:应用程序首先从缓存中查询数据(Redis)。
  2. 缓存命中?
    • 命中:直接返回缓存中的数据。
    • 未命中:从数据库(MySQL)中查询数据。
  3. 将数据写入缓存:如果从数据库中查询到数据,将数据存入缓存,并返回给客户端。
  4. 返回结果:返回查询结果(无论是从缓存还是数据库)。
写入时的操作步骤
  1. 更新数据库:首先直接将数据写入数据库(MySQL)。
  2. 更新缓存
    • 可选择立刻更新缓存,或者让缓存保持失效(通过设置缓存过期时间等机制)以便下一次查询重新从数据库中获取。
    • 另一种选择是直接删除缓存,下一次请求时会自动从数据库加载数据并缓存。
优缺点
  • 优点
    • 灵活性高,开发者可以精确控制缓存和数据库的同步。
    • 适用于读取频繁、写入不频繁的场景。
  • 缺点
    • 如果缓存未命中,数据库的负载会增加。
    • 缓存和数据库的一致性需要手动管理,容易出现同步问题。

2. Read/Write Through Pattern(读写穿透模式)

读取时的操作步骤
  1. 请求数据:应用程序请求数据时,首先从缓存中读取。
  2. 缓存命中?
    • 命中:直接返回缓存中的数据。
    • 未命中:从数据库中读取数据,并将数据存入缓存。
  3. 返回结果:返回查询结果(无论是从缓存还是数据库)。
写入时的操作步骤
  1. 更新数据库:首先将数据写入数据库。
  2. 更新缓存:数据写入数据库后,缓存会同步更新(直接写入缓存)。
  3. 返回结果:确保数据库和缓存一致后,返回给客户端。
优缺点
  • 优点
    • 自动化,缓存与数据库同步,开发者不需要手动控制缓存更新。
    • 数据一致性较好,写入操作会同步到缓存和数据库,保证了数据的一致性。
  • 缺点
    • 每次写操作都需要同步更新数据库和缓存,可能影响性能。
    • 如果缓存的更新较慢,可能会导致一些请求读取到过期的缓存数据。

3. Write Behind Pattern(异步缓存写入)

读取时的操作步骤
  1. 请求数据:应用程序请求数据时,首先从缓存中读取。
  2. 缓存命中?
    • 命中:直接返回缓存中的数据。
    • 未命中:从数据库中读取数据,并将数据存入缓存。
  3. 返回结果:返回查询结果(无论是从缓存还是数据库)。
写入时的操作步骤
  1. 更新缓存:将数据直接写入缓存,而不立即写入数据库。
  2. 异步更新数据库:缓存更新后,后台异步线程定期将数据刷新到数据库。这通常通过批量更新来减小对数据库的压力。
  3. 返回结果:数据库更新是异步的,应用程序继续处理用户请求。
优缺点
  • 优点
    • 提高写入性能,因为写操作只需要更新缓存,数据库的更新是异步的,减少了对数据库的实时写入压力。
    • 适合高频写入的场景。
  • 缺点
    • 数据一致性较差,缓存和数据库的数据可能在短时间内不同步,导致一致性问题。
    • 如果系统崩溃,可能会丢失未同步到数据库的数据。

总结:写入和读取操作的对比

模式读取操作步骤写入操作步骤
Cache Aside1. 请求缓存,若缓存命中则返回;若未命中,从数据库加载并写入缓存,再返回。1. 将数据写入数据库。
2. 更新缓存(选择性,可能删除缓存或更新缓存)。
Read/Write Through1. 请求缓存,若缓存命中则返回;若未命中,从数据库加载并写入缓存,再返回。1. 将数据写入数据库。
2. 同时更新缓存。
Write Behind1. 请求缓存,若缓存命中则返回;若未命中,从数据库加载并写入缓存,再返回。1. 将数据直接写入缓存。
2. 后台异步定期将数据刷新到数据库。

选择合适的缓存策略时,需要根据应用程序的写入负载、数据一致性要求以及对延迟的容忍度来进行决策。

相关文章:

  • 如何在1分钟内编写Cursorrules
  • Android 自定义变形 MD5 算法
  • C++和标准库速成(十二)——练习
  • lecode 2610. 转换二维数组-medium
  • 2025-03-21 Unity 序列化 —— 自定义2进制序列化
  • 初识XXL-JOB分布式任务调度
  • Scrapy 入门教程
  • WPF Reactive 数据绑定
  • 云服务器实现msf攻击
  • 【前端】Visual Studio Code安装配置教程:下载、汉化、常用组件、基本操作
  • 建造者模式 (Builder Pattern)
  • 深度学习--概率
  • 【第2月 - day6】NumPy 基础知识讲解
  • 最大异或对 The XOR Largest Pair
  • CSS 学习笔记 - 蓝桥杯重点整理
  • golang Error的一些坑
  • 解决Centos使用yum命令报错“Cannot find a valid baseurl for repo: base/7/x86_64”问题
  • c++(红黑树以及封装)
  • tradingview 2022版和2024版本的jsapi对接。
  • Java定时任务的三重境界:从单机心跳到分布式协调
  • 北斗专访|特赞科技范凌:现在AI主要是“说话”,接下来要“干活”了
  • 京东一季度净利增长五成,营收增速创近三年新高,称外卖业务取得显著进展
  • 来伊份发布关于消费者反映蜜枣粽问题处理的情况说明:与消费者达成和解
  • 牧原股份子公司与养殖户种猪买卖纠纷案一审胜诉
  • 最高降价三成,苹果中国iPhone开启大促销,能拉动多少销量?
  • 男子发寻母视频被警方批评教育,律师:发寻亲信息是正当行为