我有一个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缓存系统)看起来很合适,所以我很乐意听到那些使用过它的人的意见.
我使用ehcache进行基于RAM/DISK的缓存,这很好用.确定在内存中保留多少对象以及在磁盘上保留多少对象的确切配置可以在代码外部完成,而无需更改任何代码.没有太多可说的,它是一个缓存,它工作得很好.
我用它来存储晶圆图以避免从远程数据库中获取它们.我调整了磁盘缓存的大小,以便能够在应用程序服务器附近保留几个月的生产时间,从而节省大量时间,特别是在必须进行一些紧急返工时.