我希望在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的缓存机制?
发布于 2016-06-30 10:03:19
但是,我不知道如何在溢出后将数据库保存到数据库中(哪个数据库更适合用于更快的插入和查找确定的数据),还是应该使用文件系统?
这取决于用例。如果缓存的值非常大,则可以将每个值存储在文件中,并使用缓存键的散列作为文件名。
如果您的值很小,那么将它们作为单独的文件存储将需要大量开销,所以最好将缓存的条目存储到一个或两个文件中。要实现这一点,您需要了解“外部索引”和“内存管理”或“空闲空间管理”(例如最佳匹配、下一次匹配和压缩策略)。这实际上导致了一个小型数据库的实现,因此可以使用一个:)我脑海中浮现的一些东西: LevelDB、MapDB、LMDB、RocksDB
请记住,缓存操作同时来自应用程序,因此缓存可能会删除一个值,而对同一键的请求可能同时出现。您是只实现Cache.get和Cache.put之类的基本操作,还是实现CAS--像Cache.putIfAbsent这样的操作?您想要有效地使用多核系统,因为它们在今天很常见吗?
然而,当使用一个小型数据库时,您将需要为几个月的工程工作做准备。
有谁有更好的输入来实现Java的缓存机制?
您可以在cruftex.net上阅读我的博客,以获得更多的输入,以便在Java中实现轻量级和快速缓存。
对于带有溢出的缓存实现,您可以查看imcache。但是imcache不是一个完全成熟的泛型缓存,因为例如缺少CAS-操作,请参阅高速缓存接口。
我自己的高性能Java实现cache2k,具有CAS-操作、事件、加载器和写入器、过期等特性,它最终也会溢出到磁盘。但是,我不确定时间范围.当您有兴趣在这方面工作:欢迎您的贡献!
https://stackoverflow.com/questions/38117367
复制相似问题