【发布时间】:2018-10-22 09:32:53
【问题描述】:
我们需要构建一个复制缓存来缓存第三方应用程序数据以获得更好的性能。数据包括字符串(消息)和图像(个人资料图片)。第三方应用程序不支持 webhook 或任何其他 api 来保持数据同步。我们需要构建一个自动刷新策略来实现某种提前刷新。
大多数缓存库,包括谷歌的 guava、ehcache、cache2k 等都在内存中缓存数据。如果使用内存复制缓存,我们可以预见到一些问题
- 当应用程序服务器的数量增加时,在我们实施自动刷新(或提前刷新)时,跨服务器保持相同的缓存数据副本成为一项挑战。如果缓存数据只有一个副本,就会大大简化。
- 如果服务器崩溃需要注意重建缓存。
- 在实现直写或后写时,跨应用服务器的数据同步会很困难。
- 如果跨服务器的数据只有一份副本,则第三方 api 调用的数量会减少。
- 可以缓存的数据量不必受到限制/限制,因为它超出了 jvm 的内存。
由于数据库/文件更靠近应用服务器,因此与第三方服务器相比,性能会更好。请注意,我们的堆栈中已经有一个数据库 (Oracle),因此我们不想为此引入另一个数据库。
缓存库需要支持来自多个进程的并发写入。是否有支持上述要求的 java 库?
谢谢。
【问题讨论】:
-
这篇文章可能会有所帮助:Extending Guava caches to overflow to disk
-
@Kizivat - 感谢您的链接,但似乎 CacheLoader 仅在缓存未命中时调用,这意味着番石榴内部维护一个内存数据结构来保存缓存条目。我正在寻找没有任何内存占用的东西。每次应用程序调用缓存时,它都应该访问数据库或文件。可以为这种情况配置番石榴吗?