使用 Redis 实现直读和直写缓存

发布日期:2026-07-24 10:00:22  浏览量 :0
发布日期:2026-07-24 10:00:22  
0

旁路缓存将缓存逻辑置于您的应用程序中。直读和直写则将其移入缓存层本身,因此应用程序与缓存交互,就像它与数据库交互一样,而缓存负责从后端存储加载数据并向其写入数据。这种差异听起来很微妙,但它改变了逻辑的所有者、缓存保持一致性的方式以及复杂性的所在。了解这三种模式可以让您根据具体用例选择合适的“一致性与复杂性”权衡方案。

这是 Redis 大师班系列的第 10 部分,继旁路缓存之后。

直读:缓存未命中时进行加载

在直读模式中,应用程序始终从缓存读取数据,而缓存负责在未命中时从数据库获取数据。旁路缓存由应用程序执行“从数据库加载并填充”的步骤,而直读则将这一过程隐藏在缓存层之后:

// 应用程序代码很简单:只需从缓存读取
const user = await cache.get(`user:${id}`);
// 缓存层在未命中时,会从数据库加载数据,存储它,然后返回

从外部看,其行为与旁路缓存几乎相同:惰性加载、生存时间(TTL)、未命中时填充缓存。不同之处在于逻辑所在的位置。直读需要一个能够调用您的数据库的缓存(一个提供者、一个库或您构建的包装器),因此加载逻辑集中在一个地方,而不是在每个调用点重复。

其优势在于实现的一致性:每次读取都经过相同的加载路径,因此您不会忘记在某条代码路径中填充缓存。代价是您需要那个带有加载器的缓存层。在实践中,许多团队通过将旁路缓存包装在一个单一的共享函数中来获得直读的好处,这在没有特殊基础设施的情况下实现了相同的理念。

直写:缓存写入数据库

直写在写入侧与直读配对使用。应用程序写入缓存,缓存在确认之前同步写入数据库:

// 应用程序写入缓存;缓存直写到数据库
await cache.set(`user:${id}`, updatedUser);
// 内部流程:缓存更新 Redis 并写入数据库,然后返回

缓存和数据库在一次操作中同时更新,因此缓存始终与数据库保持一致(不会因为忘记失效而产生陈旧条目)。每次写入都使它们保持同步。

权衡之处在于写入延迟。由于写入是同步发送到缓存和数据库的,因此写入速度与数据库写入加上缓存写入的速度一样慢。您将缓存添加到了写入路径中,所以写入速度并没有变快(但读取速度变快了)。而且,无论数据是否会被读取,您都会在写入时对其进行缓存,这可能会填满缓

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

分享到:

长按或扫码识别 分享给好友

长按或扫码识别 分享给好友
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据