Redis&MySQL 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 Aside 1. 请求缓存,若缓存命中则返回;若未命中,从数据库加载并写入缓存,再返回。 1. 将数据写入数据库。 2. 更新缓存(选择性,可能删除缓存或更新缓存)。
Read/Write Through 1. 请求缓存,若缓存命中则返回;若未命中,从数据库加载并写入缓存,再返回。 1. 将数据写入数据库。 2. 同时更新缓存。
Write Behind 1. 请求缓存,若缓存命中则返回;若未命中,从数据库加载并写入缓存,再返回。 1. 将数据直接写入缓存。 2. 后台异步定期将数据刷新到数据库。

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

相关推荐
MiNG MENS1 小时前
nginx 代理 redis
运维·redis·nginx
DevilSeagull1 小时前
MySQL(2) 客户端工具和建库
开发语言·数据库·后端·mysql·服务
远洪2 小时前
claude code 国内安装使用
数据库·mysql
千月落4 小时前
Redis数据迁移
数据库·redis·缓存
小编码上说5 小时前
LSH(局部敏感哈希)分桶,海量数据下的相似性搜索解决方案
java·spring boot·缓存·langchain4j·lsh·局部敏感哈希·ai调用优化
wangbing11255 小时前
MySQL 官方 GPG 密钥过期问题
数据库·mysql
风筝在晴天搁浅5 小时前
LFU缓存
缓存
重生之我是Java开发战士5 小时前
【MySQL】事务 & 用户与权限管理
android·数据库·mysql
2401_895521346 小时前
MySQL中的count函数
数据库·mysql
.小小陈.6 小时前
MySQL 入门到实战:从基础概念到核心存储引擎
数据库·mysql