gpt4 book ai didi

java - 将Guava Cache作为我自己的持久化缓存的 "helper"是否可行?

转载 作者:行者123 更新时间:2023-11-30 09:23:40 27 4
gpt4 key购买 nike

我希望通过在服务提供者和服务客户​​端之间放置一个缓存层来减轻每次访问数据库的“查找服务”的压力。我希望这个缓存层是持久的,并且可以容纳比 RAM 允许的更多的对象,所以普通的 Guava Cache 是行不通的。我研究过 EhCache 和 CouchBase 之类的东西,但出于各种原因决定自己动手。

为这个持久缓存层编写原始代码非常容易。然而,我对缓存的了解足以让我意识到有很多并发问题需要处理,而且我很确定我不会一次就把所有问题都解决掉。例如,存在“thundering herd”问题,其中缓存未命中可能会导致大量同时向支持服务请求完全相同的对象。令我震惊的是,这正是 LoadingCache 已经处理的事情类型。尝试让 Guava 完成处理并发的困难工作,然后插入我自己的子类来进行实际的对象检索和存储,这似乎是一个合理的想法吗?我不确定我将子类化或覆盖的确切界限在哪里,但我可以弄清楚这是否只是一个完全被误导的想法。我还没有看到扩展/自定义 Guava 缓存的示例,所以如果有任何示例和/或文档可供查看,我会对这些感兴趣。

最佳答案

我最终做的事情非常简单。我制作了一个普通的 LoadingCache,并在 load 和 reload 方法中执行了一些额外的操作。这给了我钩子(Hook)(即 CacheLoader 的加载和重新加载方法)在我的本地数据库中查找一个对象,如果我找不到它就调用远程服务并持久化它,而不用担心许多线程会尝试由于 Guava 提供的所有并发保护,得到相同的对象。

我确信这与缓存的预期使用方式相去甚远,因为我实际上将缓存上的 maximumSize 设置为 0,以便始终调用我的加载函数。 (出于各种原因,我希望每次都从持久存储中提供对象,而不是从 RAM 中)。我还没有对它进行彻底的测试,但它似乎表现得如我所愿。整体效果是一个拉通式“对象镜像”,充当上游服务的 self 更新副本。

关于java - 将Guava Cache作为我自己的持久化缓存的 "helper"是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15957152/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com