2

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

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

4

1 回答 1

2

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

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

于 2013-04-24T21:04:13.630 回答