2010-06-20 70 views
6

我有一个java web应用程序,它使后端使用第三方web服务。调用Web服务会产生延迟,这对于尽可能避免重要。另外,我的应用程序只允许每天进行一定数量的Web服务调用,因此除非绝对需要,否则最好不要进行Web服务调用。同时使用RAM和磁盘的类似memcached的键/值缓存

我现在的解决方案是将Web服务结果缓存在Memcached中,这很好。基本上,我们正在利用RAM来缓存Web服务结果。

但是,我们希望把它带到下一个层次。我们还有磁盘空间,我们希望将其用作缓存Web服务结果的磁盘缓存。我想要一个系统首先检查RAM缓存(可能是Memcached,但不一定是)。当一个RAM缓存未命中发生时,我们会回到检查磁盘缓存。而当磁盘缓存未命中发生时,我们会回到调用Web服务。无论何时我们检索新的Web服务结果,我们都会更新RAM缓存和磁盘缓存。

一种可能性是将SQL数据库用作使用磁盘进行存储的系统的一部分。但这似乎并不理想。数据库往往需要大量的保姆。它们通常涉及无限制增长的文件(数据库本身或事务日志),因此您需要管理在这些增长文件开始导致文件系统耗尽空间时发生的情况。

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

所以我要寻找两种: 1)基于磁盘的键值存储系统,可以为“故障”时,Memcached的具有高速缓存未命中 OR 2)单系统,该系统将取代Memcached和行动提供RAM缓存和磁盘缓存。

我想要的其他重要特质: 1)像Memcached一样,我想要一个不需要保姆的缓存系统。 2)像Memcached一样,我希望缓存在多个服务器之间进行分片,每个对象只能位于一台服务器上。 3)像Memcached一样,我想要一些相当容易插入和使用的东西。我不想写一大堆代码来实现这个工作。

我已经看过的其他系统: 1)我相信Redis不适合这里的账单,因为它的磁盘缓存只是RAM中的内容的镜像。我希望RAM缓存成为磁盘缓存的一小部分。 2)EhCache有一个“在VM重启之间存储数据的持久磁盘存储”,但这与我上面描述的不一样。 (Java缓存系统)看起来可能是一个很好的选择,所以我很乐意听到那些使用它的人的意见。

回答

5

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

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

+1

谢谢。这可能是我正在寻找的解决方案。我现在看到您可以配置DiskStore并指定maxElementsOnDisk参数。 – 2010-06-21 02:25:00

0

MemcacheDB可能是你正在寻找的答案。 Reddit将其用于“permacache”。

+0

Reddit实际上删除了Cassandra的memcachedb:http://blog.reddit.com/2010/03/she-who-entangles-men.html – 2010-06-21 23:45:03

0

Cassandra。有超过一打的NoSQL解决方案存储在内存和磁盘上。几乎没有人像卡桑德拉一样经过战斗考验。使用facebook,reddit和digg制作,仅举几例。

0

使用Redis,它支持所有的memcache操作,并将数据保存到磁盘,并且速度非常快。卡桑德拉的阅读速度很慢,所以我不会那么做。

-1

难道鱿鱼是一个选择吗?它在cahand cahces网页结果中的内存和磁盘