简介
有效使用缓存的关键在于确定最合适的数据进行缓存,并在适当的时间缓存它。
数据可以按需加载或预填充,但预填充可能对大缓存造成初始高负载。静态、不变或少变的数据最适合缓存,如产品信息和定价。对于动态数据,缓存部分静态元素并按需获取动态部分可能是策略之一。
1 如何有效地缓存数据?
应用程序首次检索数据时,可以按需将数据添加到缓存中。应用程序只需从数据存储中获取一次数据,并且可以使用缓存满足后续访问。
或者,可以提前使用数据部分或全部填充缓存,通常在应用程序启动时(一种称为初始化设定的方法)。
但是,可能不建议为大型缓存实现这样的设定,因为此方法可能会在应用程序开始运行时对原始数据存储施加突然的高负载。
通常,对使用模式的分析可以帮助决定是完全预填充缓存还是部分预填充缓存,以及选择要缓存的数据。
例如,可以使用静态用户配置文件数据为缓存设定种子,用于定期(可能每天)使用该应用程序的客户,但不适用于每周仅使用一次该应用程序的客户。
缓存通常适用于不可变或不经常更改的数据。示例包括参考信息(如电子商务应用程序中的产品和定价信息)或构建成本高昂的共享静态资源。
可以在应用程序启动时将部分或全部此类数据加载到缓存中,以最大程度地减少对资源的需求并提高性能。
实际情况可能还希望有一个后台进程,该进程定期更新缓存中的引用数据,以确保它是最新的。或者,后台进程可以在引用数据更改时刷新缓存。
2 处理动态数据
缓存对于动态数据不太有用,尽管此注意事项有一些例外(有关详细信息,请参阅本文后面的缓存高度动态数据部分)。
当原始数据定期更改时,缓存的信息会很快过时,或者将缓存与原始数据存储同步的开销会降低缓存的有效性。
缓存不必包含实体的完整数据。例如,如果数据项表示多值对象(如具有姓名、地址和帐户余额的银行客户),则其中一些元素(如名称和地址)可能保持静态。其他元素(如账户余额)可能更具动态性。
在这些情况下,缓存数据的静态部分并在需要时仅检索(或计算)其余信息可能很有用。
建议执行性能测试和使用情况分析,以确定缓存的预填充或按需加载(或两者的组合)是否合适。
决策应基于数据的波动性和使用模式。缓存利用率和性能分析在遇到高负载且必须具有高度可伸缩性的应用程序中非常重要。
例如,在高度可缩放的方案中,可以设定缓存种子,以减少高峰时段数据存储上的负载。
缓存还可用于避免在应用程序运行时重复计算。如果操作转换数据或执行复杂的计算,它可以将操作的结果保存在缓存中。如果之后需要相同的计算,应用程序只需从缓存中检索结果即可。
应用程序可以修改缓存中保存的数据。但是,我们建议将缓存视为可能随时消失的暂时性数据存储。
不要只在缓存中存储有价值的数据;请确保在原始数据存储中也维护信息。这意味着,如果缓存不可用,则可以最大程度地减少丢失数据的机会。
2 缓存高度动态的数据
将快速变化的信息存储在持久性数据存储中时,可能会给系统带来开销。
例如,考虑持续报告状态或某些其他测量值的设备。
如果应用程序选择不缓存此数据,因为缓存的信息几乎总是过时,则在从数据存储中存储和检索此信息时,可能也会考虑相同的因素。在保存和获取此数据所需的时间中,它可能已更改。
在这种情况下,请考虑将动态信息直接存储在缓存中而不是存储在持久性数据存储中的好处。
如果数据是非关键数据并且不需要审核,则偶尔丢失更改也无关紧要。
3 小结
对应用来讲,一般不直接在编程使用分布式数据库,因此后端需要采用一些处理。 比如采用哪类透明性,如何有效组织数据以备读写。 高度动态数据可直接存于缓存中,若丢失非关键数据影响不大。缓存策略应基于数据波动性和使用模式,通过性能测试和分析来优化。我们下面继续了解。