我正在构建一个数据密集型应用程序(分析),我正在考虑设计缓存机制是否会带来性能优势。该应用程序执行大量频繁的写入/更新。在这种情况下有一个缓存是否有意义,因为更新是更频繁的查找?仅当写入的大小很小但频繁时,高速缓存中是否使用缓存?一般来说,如果数据很热(最常访问),写入的大小是一个很好的指标吗?
答案 0 :(得分:4)
根据我的经验,“缓存设计”是黑人艺术与硬科学的混合体。虽然硬科学往往是非常可预测的,但这会使你认为有一个公式,或者至少是一个好的经验法则,你可以申请获得有用的结果。黑色艺术部分意味着这是真的,但在完全保持真实的情况下完全被证伪。
然而,有一点仍然是不变的,需要全面的指标。基于使用Real World™数据分析应用程序,您必须无条件地拥有大量数字。没有这个,你只是在猜测。几十年的实践经验已经一次又一次地表明,如果作为一名程序员,你正在猜测“性能问题在哪里”的性质,那么你百分之百地保证会弄错。因此需要坚实的经验数据。
如果您决定继续这样做,那么在您开始“解决问题”之前,您必须做的第一件事就是找到一种收集经验指标的方法。由于您没有提及您正在使用的语言或工具,我无法提出具体的建议,但几乎每个工具链都有一些专门用于帮助您了解您的计划花费时间的分析工具。
接下来,你在这种情况下的直觉可能是正确的。您已经确定您的访问模式可能是“写入偏倚”。写作的一个非常常见的属性是“它们必须在你做任何其他事情之前发生”。如果这涉及将数据写入磁盘,则通常会在等待磁盘i / o操作完成时遇到瓶颈,这通常是一个真正的性能杀手。在这种情况下,缓存根本不可能有所帮助,因为它不像你可以“缓存写入”,因为它必须发生。
在某些情况下,“写入缓存”可以提供帮助。如果您的设计和要求允许内存版本的数据暂时与磁盘版本的数据不一致,则通常可以“写入组合”。这主要涉及延迟将数据提交到磁盘,因为对于某些访问模式,某些非连续写入将“更新”“刷新到磁盘”窗口中的相同“块”。
在设计缓存系统时,必须做的另一件事是采用所有指标,了解缓存的工作原理,然后编写与您的设计选择最正交的性能测试。理想情况下,即使在最糟糕的情况下,您的缓存系统也不应显着降低性能,并且始终存在最糟糕的情况。
修改强>
重新阅读您的问题后,目前尚不清楚这是您现在遇到的性能问题,还是您认为“可能”遇到的性能问题。如果是后者,重新阅读,至少三次,我的答案中的第二段。您应该考虑构建缓存系统的 时间是指您使用经验数据很难确定性能问题。
答案 1 :(得分:1)
缓存最常用于读取密集型应用程序。如果应用程序以任何方式崩溃,新的更新/写入将丢失,则使用缓存来存储更新/写入是有风险的b / c。因此,需要经常将缓存写入磁盘(取决于写入/更新的频率)。
您可以写入缓存并让异步进程将缓存写入磁盘并定期刷新缓存(同样取决于写入/更新的频率)。如果这是异步的,则缓存仍可用于提供读/新写入。
写入的频率(而不是大小)通常表示缓存有多热。
答案 2 :(得分:0)
缓存可提高传输性能。增加的一部分同样来自多个小转移将组合成一个大块的可能性。但主要的性能增益是因为很有可能多次从缓存中读取相同的数据,或者很快就会读取写入的数据。缓存的唯一目的是减少对底层较慢存储的访问。因此,您应该特别注意实际缓存的时间和内容。
答案 3 :(得分:0)
这实际上取决于许多因素,但一般来说,当读取次数(对于给定数据)远远超过写入次数时,缓存策略提供了最大的好处。 EHCache documentation对入门缓存原则有很好的概述。