Caching 缓存设计问题

Caching 缓存设计问题,caching,architecture,Caching,Architecture,我正在构建一个数据密集型应用程序(分析),我正在考虑设计缓存机制是否会带来性能优势。应用程序执行大量频繁的写入/更新。由于更新比查找更频繁,在这种情况下使用缓存有意义吗?高速缓存是否仅在写入的大小很小但很频繁时才用于大容量应用程序?一般来说,如果数据是热的(访问频率最高),写操作的大小是否是一个良好的指标?缓存可以提高传输性能。增长的一部分同样来自于多个小转账合并成一个大区块的可能性。但主要的性能提升是因为很有可能从缓存多次读取相同的数据,或者很快就会读取写入的数据。缓存的唯一目的是减少对底层较

我正在构建一个数据密集型应用程序(分析),我正在考虑设计缓存机制是否会带来性能优势。应用程序执行大量频繁的写入/更新。由于更新比查找更频繁,在这种情况下使用缓存有意义吗?高速缓存是否仅在写入的大小很小但很频繁时才用于大容量应用程序?一般来说,如果数据是热的(访问频率最高),写操作的大小是否是一个良好的指标?

缓存可以提高传输性能。增长的一部分同样来自于多个小转账合并成一个大区块的可能性。但主要的性能提升是因为很有可能从缓存多次读取相同的数据,或者很快就会读取写入的数据。缓存的唯一目的是减少对底层较慢存储的访问。因此,您应该特别注意实际缓存的时间和内容。

缓存可以提高传输性能。增长的一部分同样来自于多个小转账合并成一个大区块的可能性。但主要的性能提升是因为很有可能从缓存多次读取相同的数据,或者很快就会读取写入的数据。缓存的唯一目的是减少对底层较慢存储的访问。因此,您应该特别注意实际缓存的时间和内容。

这确实取决于许多因素,但一般来说,当读取(给定数据)的数量远远超过写入的数量时,缓存策略提供了最大的好处。对介绍性缓存原则有很好的概述。

这确实取决于许多因素,但一般来说,当读取(对于给定数据)的数量远远超过写入的数量时,缓存策略提供了最大的好处。对介绍性缓存原则有很好的概述。

缓存最常用于读密集型应用程序。如果应用程序以任何方式崩溃,新的更新/写入丢失,则使用缓存存储更新/写入是有风险的。因此,缓存需要每隔一段时间写入磁盘(取决于写入/更新的频率)

您可以写入缓存,让异步进程将缓存写入磁盘,并定期刷新缓存(同样取决于写入/更新的频率)。如果这是异步的,缓存仍然可以用于服务读/写操作


写入的频率(而不是大小)通常是缓存有多热的指标

缓存最常用于读密集型应用程序。如果应用程序以任何方式崩溃,新的更新/写入丢失,则使用缓存存储更新/写入是有风险的。因此,缓存需要每隔一段时间写入磁盘(取决于写入/更新的频率)

您可以写入缓存,让异步进程将缓存写入磁盘,并定期刷新缓存(同样取决于写入/更新的频率)。如果这是异步的,缓存仍然可以用于服务读/写操作


写入的频率(而不是大小)通常是缓存有多热的指标

根据我的经验,“缓存设计”是黑色艺术和硬科学的混合体。虽然硬科学往往是非常可预测的,但这会让你认为有一个公式,或者至少是一个好的经验法则,你可以应用它来获得有用的结果。黑色艺术部分的意思是这是真实的,但完全是伪造的,同时仍然设法保持真实

然而,有一件事保持不变,那就是需要全面的度量标准。您必须无条件地拥有大量基于使用真实世界分析应用程序的数据™ 数据。没有这个,你只是在猜测。几十年的实践经验一次又一次地表明,作为程序员,如果你在猜测“性能问题在哪里”的本质,你肯定会100%地弄错。因此需要硬的经验数据

如果你决定继续这样做,在你开始“解决问题”之前,你必须做的第一件事就是找到一种收集经验指标的方法。由于您没有提到正在使用的语言或工具,因此我无法给出具体的建议,但实际上每个工具链都有一些专门设计的分析工具,以帮助您了解程序在哪里花费时间

接下来,你在这种情况下的直觉可能是正确的。您已经发现您的访问模式可能是“写偏颇的”。写操作的一个非常常见的特性是“它们必须在你做任何其他事情之前发生”。如果这涉及到将数据写入磁盘,那么在等待磁盘i/o操作完成时通常会遇到瓶颈,这通常是一个真正的性能杀手。在这种情况下,缓存不太可能有任何帮助,因为它不像您可以“缓存写入”,因为它必须发生

在某些情况下,“写缓存”会有所帮助。如果您的设计和要求允许内存中的数据版本与磁盘上的数据版本暂时不一致,则通常可以“写入”。这本质上涉及延迟将数据提交到磁盘,因为对于某些访问模式,某些非连续写入将在“刷新到磁盘”窗口中“更新”相同的“块”

在设计缓存系统时,您必须做的另一件事是了解您的所有指标和您对缓存工作方式的理解,然后编写与您的设计选择最大程度正交的性能测试。理想情况下,即使在最坏的情况下,缓存系统也不应明显降低性能,而且总是存在最坏的情况

编辑

重读后