类似于memcached的键/值缓存,它同时使用RAM和磁盘

时间:2010-06-20 19:55:14

标签: java caching persistence memcached distributed

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

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

但是,我们希望将此提升到一个新的水平。我们还有磁盘空间,我们希望将其用作磁盘缓存来缓存Web服务结果。我想要一个系统,首先我们检查RAM缓存(可能是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缓存系统)看起来很合适,所以我很乐意听到那些使用过它的人的意见。

7 个答案:

答案 0 :(得分:5)

我使用ehcache进行基于RAM / DISK的缓存,这很好用。确定在内存中保留多少对象以及在磁盘上保留多少对象的确切配置可以在代码外部完成,而无需更改任何代码。没有太多可说的,它是一个缓存,它的工作正常。

我用它来存储晶圆图以避免从远程数据库中获取它们。我调整了磁盘缓存的大小,以便能够在应用程序服务器附近保留几个月的生产时间,从而节省大量时间,特别是在必须进行一些紧急返工时。

答案 1 :(得分:0)

MemcacheDB可能是您正在寻找的答案。 Reddit将它用作“permacache”。

答案 2 :(得分:0)

答案 3 :(得分:0)

Cassandra。有十几种NoSQL解决方案存储在内存和磁盘中。很少有人像Cassandra一样经过实战考验。 facebook,reddit和digg在制作中使用,仅举几例。

答案 4 :(得分:0)

使用Redis,它支持所有内存缓存操作并将数据保存到磁盘并且速度非常快。 cassandra的读取速度很慢所以我不会那样做。

答案 5 :(得分:0)

同时检查Membase。它非常像memcached但支持磁盘持久性。

http://en.wikipedia.org/wiki/Membase
http://www.membase.org/

答案 6 :(得分:-1)

鱿鱼可以选择吗?它将网页结果缓存在ram和磁盘