【问题标题】:Custom caching implementation in JavaJava中的自定义缓存实现
【发布时间】:2016-06-30 08:07:42
【问题描述】:

我想在 Java 中实现某种轻量级缓存,它可以很容易地集成到 Java 中,并且应该很容易与 Java 应用程序一起部署。

缓存层将在应用程序和数据库层之间:没有数据库缓存,没有 Spring,没有 Hibernate,没有 EHcache,没有 http 缓存。

我们可以使用文件系统或者nano数据库,这样可以恢复缓存,这样在进程重启后可以恢复缓存。

我试过 LRU 缓存:

http://stackoverflow.com/questions/224868/easy-simple-to-use-lru-cache-in-java

http://www.programcreek.com/2013/03/leetcode-lru-cache-java/

但我不确定在溢出后如何将数据库保存到数据库中(哪个数据库更适合更快地插入和查找数据)。还是我应该使用文件系统?

任何人有更好的输入来在 Java 中实现缓存机制?

【问题讨论】:

  • 要确定在您的情况下哪个更快,您需要对其进行测量。数据库和文件系统的速度取决于很多因素。您使用的硬盘驱动器或 SSD 类型,您在该驱动器上使用的文件系统......因此,如果您尝试过不止一种方法,只需使用测试数据来衡量速度。
  • 这不是我可以使用 nano 数据库的主要问题......但这里的问题是如何在 java 中实现自定义缓存?哪个 nano 数据库最适合使用?
  • 即使使用缓存也是微不足道的(如果缓存实现了Map 接口),实现持久缓存也不是一件容易的事。所以你真的想重新发明轮子吗?例如,为什么不能使用 EHcache?
  • @PeterMmm 我可以使用现有的 Java API,如 LRU 缓存或 Guava 缓存......但我不知道如何将数据保存到数据库中(作为 jdbc?它会更快?)作为关键值对,然后更新值并再次将其保存到数据库中?有什么想法/算法吗?

标签: java caching lru


【解决方案1】:

但我不确定在溢出后如何将数据库保存到数据库中(哪个数据库更适合用于更快的插入和查找 ok 数据)或者我应该使用文件系统?

这取决于用例。如果您的缓存值非常大,您可以将每个缓存值存储在一个文件中,并使用缓存键的哈希值作为文件名。

如果您的值很小,将它们存储为单独的文件会产生很多开销,因此最好将缓存的条目存储到一个或几个文件中。要实现这一点,您需要了解“外部索引”和“内存管理”或“可用空间管理”(例如最佳拟合、下一次拟合和压缩策略)。这实际上导致了一个小型数据库的实现,所以可能会使用一个:) 我想到的一些东西:LevelDB、MapDB、LMDB、RocksDB

请记住,缓存操作是同时从应用程序进来的,因此缓存可能会驱逐一个值,而对同一键的请求可能会同时进来。你会实现像Cache.getCache.put 这样的基本操作还是像Cache.putIfAbsent 这样的CAS 操作?您想高效地使用如今很常见的多核系统吗?

不过,在使用小型数据库时,您仍需要为几个月的工程工作做好准备。

任何人有更好的输入来在 Java 中实现缓存机制?

您可以阅读我的博客cruftex.net 以获得更多信息,以在 Java 中实现轻量级和快速缓存。

有关溢出的缓存实现,您可以查看imcache。但是 imcache 不是一个成熟的通用缓存,因为缺少例如 CAS 操作,请参阅Cache interface

我自己的高性能 Java 缓存实现cache2k,具有 CAS 操作、事件、加载器和写入器、到期等功能,它最终也会溢出到磁盘。但是,我不确定时间框架...如果您有兴趣在该领域工作:欢迎投稿!

【讨论】:

  • 感谢 cruftex .. 我肯定会提供我的意见。是的,我绝对需要 CAS 操作。我正在浏览 cache2K 文档,如何将它与我的项目集成。
  • 嗨 cruftex,我没有找到关于如何将 cache2K 与 java 项目集成的适当文档?你能帮帮我吗?
  • 我目前正在扩展和改进文档。它还没有正式发布,所以你找不到它。请参阅上面的链接以开始使用。
  • 嗨 cruftex,我们有没有办法在关闭或超时时将缓存数据持久保存到小型数据库中,以便在启动时恢复它们?在 cache2K 中还是在 guava 缓存中?
猜你喜欢
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2011-10-31
  • 2015-07-19
  • 1970-01-01
  • 2011-01-25
  • 2010-09-23
相关资源
最近更新 更多