Java缓存框架用于存储大量数据。
上下文:我们正在使用Jersey 2.6开发一个Restful服务,并将其部署在WAS 8.5上。该服务每天需要处理超过1000万个请求。
我们需要实现一个缓存来存储超过300k的对象(数据将来自数据库)。而且我们需要一种方式来每天更新缓存。
- 建议采用缓存300k对象并每天更新它们的方法吗?
- 是否有任何支持此类功能的Java框架?
此外,更多的上下文信息会很有用,特别是:
根据您提供的数据点为300k和10M请求,意味着您预计每个对象平均会被访问33次/天,这表明您更关心后端数据库负载而不是实时响应。
根据我的经验,有很多相当原始的解决方案,比选择Mongo、Cassandra或Coherence等大型分布式系统要有效得多。
我的第一个建议是:保持简单- 300k对象不会造成太大的存储压力,可以使用内部哈希表存储,每天刷新一次并在第一次请求时填充。
如果需要水平扩展,则建议使用1天缓存时间的Memcache Spymemcached,当找不到现有条目时进行填充。
除非您真正有强烈的理由需要持久性存储,否则我不会选择像Cassandra或Mongo这样的东西。原因:清除可能变得非常繁重,特别是如果您的数据速度很快。例如:Cassandra实际上不知道如何删除,而是用“墓碑”标记已删除的条目,这意味着您的数据存储将不断增长,直到您创建一个清除策略。
对于缓存提供程序,我建议使用Coherence,我在我的公司使用了Coherence,它非常强大,并且可以在多个集群之间同步。
对于如何处理缓存的另一个问题,这取决于您的应用程序的性质。根据我的缓存经验,我已决定在以下情况下更新缓存: 1. 网格分页 2. 浏览
并决定清除缓存并重新加载数据:
我做出这样的决定是因为维护缓存会给你带来过多的麻烦,特别是当你处理某种统计数据和嵌套层次结构时。
希望这能帮助到您。
是的,例如:Coherence、Hazelcast。它们都是分布式缓存。 http://java.dzone.com/articles/sneak-peek-jcache-api-jsr-107
一般来说,您应该缓存您正在使用的内容,并且缓存应该始终保持同步而不是每天更新。您可以将最近使用的对象放入缓存中,并通过缓存进行读/写以访问您的数据库。
如果你有足够的资金,最好的选择是使用Coherence(其声誉已经得到大型金融公司的证明)。
Hazelcast是另一种分布式缓存内存,根据性能指标,它比Coherence低一个级别。