我想在Java中实现某种轻量级缓存,这种缓存很容易在Java中集成,并且应该很容易使用Java应用程序进行部署。
缓存层将位于应用程序和数据库层之间:没有数据库缓存,没有Spring,没有Hibernate,没有EHcache,没有http缓存。
我们可以使用文件系统或nano数据库,以便可以恢复缓存,以便在重新启动进程后恢复缓存。
我尝试了LRU Cache:
http://stackoverflow.com/questions/224868/easy-simple-to-use-lru-cache-in-java
http://www.programcreek.com/2013/03/leetcode-lru-cache-java/
但是我不确定如何在溢出之后将数据库保存到数据库中(哪个数据库更适合用于更快的插入和搜索数据)。或者我应该使用文件系统?
任何人都有更好的输入来实现Java中的缓存机制吗?
答案 0 :(得分:1)
但是我不知道如何在溢出后将数据库保存到数据库中(哪个数据库更好用于更快的插入和搜索ok数据)或者我应该使用文件系统?
这取决于用例。如果您的缓存值非常大,您可以将每个缓存的值存储在一个文件中,并使用缓存键的哈希作为文件名。
如果您的值大小很小,将它们存储为单独的文件将会产生大量开销,因此最好将缓存的条目存储到一个或几个文件中。要实现这一点,您需要了解"外部索引"和"内存管理"或者"自由空间管理" (例如最佳适合,下一个适合和压实策略)。这实际上导致了一个小型数据库的实现,所以可能会使用一个:)我想到的一些东西:LevelDB,MapDB,LMDB,RocksDB
请记住,缓存操作是从应用程序同时进行的,因此缓存可能会逐出一个值,并且对同一个键的请求可能会同时进入。您是仅实施Cache.get
和Cache.put
等基本操作,还是Cache.putIfAbsent
等CAS操作?您是否希望有效地使用多核系统,因为它们在今天很常见?
但是,当使用小型数据库时,您需要准备好几个月的工程工作。
任何人都有更好的输入来实现Java中的缓存机制吗?
您可以在cruftex.net阅读我的博客,获取更多信息,以便在Java中实现轻量级和快速缓存。
对于有溢出的缓存实现,您可以查看imcache。但imcache不是一个完全成熟的通用缓存,因为例如缺少CAS操作,请参阅Cache interface
我自己的高性能Java缓存实现cache2k,具有CAS操作,事件,加载器和编写器,到期等,并且最终也会有一些溢出到磁盘。但是,我不确定时间框架......如果您有兴趣在这个领域工作:欢迎捐款!