Java 中的自定义缓存实现

Custom caching implementation in Java

我想在 Java 中实现某种轻量级缓存,它很容易集成到 Java 中,应该很容易用 Java 应用程序部署。

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

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

我尝试了 LRU 缓存:

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

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

谁有更好的输入来实现 Java 中的缓存机制?

But I am not sure how to after overflow should I save database into database(which database will be better to use for faster insert ans seek ok data) Or I should use File System?

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

如果您的值较小,将它们存储为单独的文件会产生大量开销,因此最好将缓存的条目存储到一个或多个文件中。要实现这一点,您需要了解 "external indexes" 和 "memory management" 或 "free space management"(例如最适合、次适合和压缩策略)。这实际上导致了一个微型数据库的实现,所以可以使用一个 :) 我想到了一些东西:LevelDB、MapDB、LMDB、RocksDB

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

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

Any one has better inputs to implement caching mechanism in Java?

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

对于溢出的缓存实现,你可以看一下imcache. But imcache is not a fully-fledged generic cache, because for example CAS-operations are missing, see the Cache interface

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