【问题标题】:Is there a java cache library that stores data in database instead of in-memory?是否有将数据存储在数据库中而不是内存中的 java 缓存库?
【发布时间】:2018-10-22 09:32:53
【问题描述】:

我们需要构建一个复制缓存来缓存第三方应用程序数据以获得更好的性能。数据包括字符串(消息)和图像(个人资料图片)。第三方应用程序不支持 webhook 或任何其他 api 来保持数据同步。我们需要构建一个自动刷新策略来实现某种提前刷新。

大多数缓存库,包括谷歌的 guava、ehcache、cache2k 等都在内存中缓存数据。如果使用内存复制缓存,我们可以预见到一些问题

  1. 当应用程序服务器的数量增加时,在我们实施自动刷新(或提前刷新)时,跨服务器保持相同的缓存数据副本成为一项挑战。如果缓存数据只有一个副本,就会大大简化。
  2. 如果服务器崩溃需要注意重建缓存。
  3. 在实现直写或后写时,跨应用服务器的数据同步会很困难。
  4. 如果跨服务器的数据只有一份副本,则第三方 api 调用的数量会减少。
  5. 可以缓存的数据量不必受到限制/限制,因为它超出了 jvm 的内存。

由于数据库/文件更靠近应用服务器,因此与第三方服务器相比,性能会更好。请注意,我们的堆栈中已经有一个数据库 (Oracle),因此我们不想为此引入另一个数据库。

缓存库需要支持来自多个进程的并发写入。是否有支持上述要求的 java 库?

谢谢。

【问题讨论】:

  • 这篇文章可能会有所帮助:Extending Guava caches to overflow to disk
  • @Kizivat - 感谢您的链接,但似乎 CacheLoader 仅在缓存未命中时调用,这意味着番石榴内部维护一个内存数据结构来保存缓存条目。我正在寻找没有任何内存占用的东西。每次应用程序调用缓存时,它都应该访问数据库或文件。可以为这种情况配置番石榴吗?

标签: java caching


【解决方案1】:

我们有类似的需求,我们继续将 MongoDB 改编为 nosql 数据库。

这实际上取决于应用程序的类型,但使用微服务和 REST/Json 适配使用 mongodb 可能是您的正确选择。具有正确配置和副本集的 MongoDB 是非常强大且可扩展的解决方案,可以处理具有正确索引查找字段的数百万条记录的性能。

MongoDB 的设计方式是使用部署它的服务器的大部分内存并将数据保存在内存中,这使其与缓存一样好。从应用程序的角度来看,它是您的同步数据 - 它是完全可扩展的,并使用 SSD 等高性能磁盘对持久数据进行数据检索。

还有许多受支持的功能,例如文档上的到期等 ,这使得管理和清除缓存以控制空间变得非常容易。

您的所有应用程序服务器都可以连接到 mongo 副本集,您还可以启用从辅助 mongo 服务器读取,以充分利用 mongo db 副本集。

要考虑的其他选项是 Apache cassandra 和其他 nosql 解决方案。

希望对你有帮助!

【讨论】:

  • 好建议,但我忘了提一个警告——我们的堆栈中已经有 Oracle。现在更新了描述。理想的做法是重复使用相同的数据来保存这些数据。我试图了解开箱即用的 java 库是否有这样的要求。
  • 嗨,安迪,我明白你的意思了。没有使用 oracle 来满足这种缓存要求,但是我可以理解在应用程序堆栈中引入新组件是一项相当繁琐的任务。我不知道/确定是否有任何 java lib 可以在没有底层数据库支持的情况下做到这一点。您可以考虑使用混合模型,许多组织都遵循这种模型,例如用于关系数据库的 Oracle 和用于瞬态数据的其他 nosql 解决方案。
猜你喜欢
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 2017-06-16
相关资源
最近更新 更多