实施缓存策略:高性能 Web 应用程序的技术

2025-06-07

实施缓存策略:高性能 Web 应用程序的技术

缓存策略?那是什么?

注意:如果您还没有阅读上一篇博客《深入探讨缓存:高性能 Web 应用程序的技术》 。

在深入探讨之前,让我们先了解一下一些常见的政策

  1. 直写:数据同时(并行)写入缓存和后备存储/数据库。

  2. 写入:数据仅写入后备存储/数据库,而不是缓存。

  3. 后台写入/后置写入:数据首先写入缓存,然后在后台写入后备存储/数据库。

  4. 直读:数据被写入后备存储/数据库。如果数据被读取,则会写入缓存。这使得首次读取数据耗时较长,但后续读取速度会更快。

上述每种政策都有其优点和缺点。

在分布式/微服务架构中,系统会根据整个系统的规模进一步分布,并涉及分片等其他技术。我会在其他博客上讨论这个问题。

问题

啊,什么时候该制定哪些写作政策?

让我们了解一下每个用例

1. 直写政策

  • 数据一致性:当需要缓存和底层数据存储之间保持强一致性时,写入缓存的任何数据都会立即在后备存储中可用。

  • 简单的实现:由于每个写入操作都会传播到底层数据存储,因此易于实现和理解。

  • 读取繁重的工作负载:适用于读取操作比写入操作更频繁的场景,因为缓存中的数据始终与数据存储一致。

例子:

  • 会话管理:在 Web 应用程序中,会话数据需要在多个节点之间保持一致并立即可用。

  • 配置数据:经常读取但很少更改的配置设置。

2. 围绕政策写作

  • 写入密集型工作负载:适用于写入频繁、读取不频繁的应用程序,减少对缓存的写入操作次数。

  • 冷数据:适用于数据写入后访问频率不高的场景。缓存不会因为访问频率低的数据而负担过重。

例子:

  • 批量数据导入:定期导入不需要立即读取的大型数据集的应用程序。

  • 日志系统:将日志数据直接写入存储器但仅偶尔读取数据进行分析的系统。

3. 回写政策

  • 性能:通过快速确认写入操作并推迟对数据存储的实际写入来提高写入性能。

  • 批处理:适用于可以将数据批量写入底层存储的场景,减少写入负载。

  • 数据新鲜度:适用于即时一致性不是至关重要的情况,并且可以接受数据传播到数据存储的轻微延迟。

例子:

  • 用户活动日志:记录用户操作的应用程序,其中日志定期刷新到数据库。

  • 电子商务:购物车数据写入缓存以便快速访问,并定期与数据库同步。

4. 通读

  • 延迟加载:适用于按需加载数据,仅在实际需要时缓存数据。

  • 读取繁重的工作负载:适用于读取操作明显多于写入操作的应用程序,并且数据需要在首次访问后快速访问。

例子:

  • 产品目录:电子商务应用程序,其中产品详细信息被频繁读取但不经常更新。

  • 内容管理系统 (CMS):文章或媒体在首次发布后会被频繁阅读的系统。

何时选择什么

需要一致性

  • 直写:由于数据同时写入缓存和存储,因此可确保强一致性。

  • 重复写入:可能导致缓存数据过时,直到数据被读取和缓存。

  • 后写:提供最终一致性,但缓存和存储之间可能存在滞后。

  • 读通:确保数据在第一次访问时被缓存,如果不经常更新,可能会导致数据过时。

需要表现

  • 直写:由于双重写入(缓存和存储),写入操作可能会更慢。

  • 写入:减少缓存上的写入负载,加快写入操作。

  • 后写:提高写入性能,但如果缓存和存储不同步,读取操作可能会受到影响。

  • 读通:初始缓存未命中后快速读取操作,适用于读取密集型场景。

需要简单

  • 直写:易于实现并确保即时一致性。

  • 写入:写入操作简单,但读取时需要缓存管理。

  • 后写:由于需要异步写入处理和潜在的一致性问题,因此更加复杂。

  • 读取:直接读取,需要处理初始缓存未命中。

这取决于您正在解决的用例。

现在让我们深入了解实现缓存时所使用的策略。

开发人员:我大部分时间都使用OG,LRU缓存。

LRU(最近最少使用)是一种流行的缓存策略,但它并不总是适合所有用例。目前有几种备选的缓存策略,每种策略都有各自的优势和适用场景。

有很多都有自己的用例,这里会列举它们

  • LRU:最适合最近访问的项目很可能很快再次被访问的情况。

  • LFU:当访问频率可以很好地预测未来的访问时,效果最佳。

  • FIFO:简单,当最旧的数据最没用时最好。

  • 随机替换(RR):简单,适用于不可预测的访问模式。

  • 生存时间 (TTL):最适合在一定时间后变得陈旧的时间敏感数据。

  • 自适应替换缓存(ARC):能够很好地适应不断变化的访问模式,更加复杂。

  • 最近最少/最不常用(LRFU):最近使用率和频率之间的平衡,可调。

  • 隔离 LRU (SLRU):适用于具有不同类型数据的多段缓存。

  • 最近使用(MRU):在最新数据不太有用的特定场景中很有用。

  • 时钟算法:LRU 的一种变体,使用循环缓冲区(时钟)和每个页面的使用位来近似其行为。

  • 2Queue:使用单独的队列平衡新近度和频率。

一些框架默认支持这种策略,例如 Django、Spring Boot 等等。

如果你读到这里,请阅读这篇博客。感谢阅读。希望这篇博客是关于缓存的。

我们学到了什么

  1. 何时使用哪种策略来实现缓存
  2. 如何通过使用各种实现缓存的技术来避免缓存过载。

关注更多有趣的博客,关注我会激励我写一些更有趣的东西。

这是我的社交 - LinkedIn

文章来源:https://dev.to/nayanraj-adhikary/implementing-caching-strategies-techniques-for-high-performance-web-apps-3dm7
PREV
使用 Lumen(v5.8) 构建 JWT 认证 API
NEXT
Docker CLI 备忘单...