Java memcached类似于使用RAM和磁盘的键/值缓存

Java memcached类似于使用RAM和磁盘的键/值缓存,java,caching,persistence,memcached,distributed,Java,Caching,Persistence,Memcached,Distributed,我有一个java web应用程序,可以在后端使用第三方web服务。调用web服务会产生延迟,这一点在任何可能的情况下都必须避免。此外,我的应用程序每天只能进行一定数量的web服务调用,因此除非绝对需要,否则最好不要进行web服务调用 我目前的解决方案是将web服务结果缓存在Memcached中,这很有效。基本上,我们使用RAM来缓存web服务结果 然而,我们希望把这一点提高到一个新的水平。我们还有磁盘空间,我们希望将其用作缓存web服务结果的磁盘缓存。我想要一个系统,首先检查RAM缓存(可以是M

我有一个java web应用程序,可以在后端使用第三方web服务。调用web服务会产生延迟,这一点在任何可能的情况下都必须避免。此外,我的应用程序每天只能进行一定数量的web服务调用,因此除非绝对需要,否则最好不要进行web服务调用

我目前的解决方案是将web服务结果缓存在Memcached中,这很有效。基本上,我们使用RAM来缓存web服务结果

然而,我们希望把这一点提高到一个新的水平。我们还有磁盘空间,我们希望将其用作缓存web服务结果的磁盘缓存。我想要一个系统,首先检查RAM缓存(可以是Memcached,但不一定是Memcached)。当RAM缓存未命中时,我们将返回到检查磁盘缓存。当发生磁盘缓存丢失时,我们将返回调用web服务。无论何时检索新的web服务结果,我们都会更新RAM缓存和磁盘缓存

一种可能是使用SQL数据库作为使用磁盘存储的系统的一部分。但这似乎不太理想。数据库往往需要很多保姆。它们通常涉及到文件(数据库本身或事务日志),这些文件在没有绑定的情况下增长,因此您需要管理当这些增长的文件开始导致文件系统空间不足时会发生什么情况

相反,我希望系统中基于磁盘的部分能够告诉它要使用多少磁盘空间,并保证它不会使用更多的磁盘空间。当空间用完时,它将自动开始丢弃最近使用最少的键值对。我绝对不需要ACID,所以应该没有事务日志

因此,我希望: 1) 一种基于磁盘的键值存储系统,当Memcached出现缓存未命中时,它可以充当“故障切换” 或 2) 一个替代Memcached并同时提供RAM缓存和磁盘缓存的单一系统

我想要的其他重要品质: 1) 像Memcached一样,我想要一个不需要保姆的缓存系统。 2) 像Memcached一样,我希望缓存在多个服务器上进行切分,每个对象都位于一个服务器上。 3) 像Memcached一样,我想要一个相当容易插入和使用的东西。我不想写太多的代码来让它工作

我已经看过的其他系统: 1) 我认为Redis不适合这里,因为它的磁盘缓存只是RAM中的镜像。我希望RAM缓存是磁盘缓存的一小部分。 2) EhCache有一个“持久磁盘存储”,它在VM重启之间存储数据‎", 但这与我上面描述的不太相似


Apache JCS(Java缓存系统)看起来可能很适合,所以我很想听听使用过它的人对它的看法。

MemcacheDB可能是您想要的答案。Reddit将它用于其“永久缓存”“

我曾用于基于RAM/磁盘的缓存,效果很好。确定要在内存中保留多少对象以及要在磁盘上保留多少对象的确切配置可以在代码之外完成,而无需任何代码更改。没什么好说的,这是一个缓存,它工作得很好


我用它来存储WAFERMAP,以避免从远程数据库获取它们。我调整了diskcache的大小,使其能够在appserver附近保持数月的生产,从而大大节省了时间,尤其是在必须进行一些紧急返工时

您需要

。有十几种NoSQL解决方案同时存储到内存和磁盘。很少有人能像卡桑德拉那样经受战斗考验。facebook、reddit和digg在生产中使用过。使用Redis,它支持所有memcache操作,将数据保存到磁盘,速度非常快。cassandra的读取速度很慢,所以我不会这么做。

还要检查Membase。它很像memcached,但支持磁盘持久性



鱿鱼是一种选择吗?它可以在ram和磁盘中显示web结果

谢谢。这可能是我正在寻找的解决方案。我现在看到,您可以配置DiskStore并指定maxElementsOnDisk参数。Reddit实际上为Cassandra删除了memcachedb: