多级进程内缓存的更好选择是什么?

时间:2016-10-28 00:50:49

标签: java spring caching spring-boot ehcache

在我的spring启动应用程序中,我需要实现一个进程内多级缓存 以下是需要缓存的数据示例:

客户名称(密钥,字符串)    --data实体名称(键,字符串)      --config-1(value,JSONObject)      --config-2(value,JSONObject)

我计划有几百个客户条目,每条条目最多有一百个“配置”JSONObjects

我目前正在关注ehcache:

Cache cache = manager.getCache("sampleCache1");
Element element = new Element("key1", "value1");
cache.put(element);

在这种情况下,我会用“Customer_Name”代替“key1”,用“My Customer”代替“value1”,但是我需要建立一个层次结构:

customer
 -data entity
   -config

我不知道如何用ehcache做到这一点。 我也不确定我是否有更好的选择。

有没有人用ehcache或任何其他库实现这样的多级分层缓存?

1 个答案:

答案 0 :(得分:2)

对于表示法,我使用类似地图的缓存:value = Cache.get(key),这比EHCache2 Element

更常见

选项1:构建复合关键对象

 class CustomerConfigurationKey {
    String customerKey;
    String dataEntityKey;
    // equals() and hashCode()
 }

这是非常标准的键/值存储,包括普通地图。我确实在cache2k Quick Start中解决了这个问题。

选项2:使用多级缓存

将缓存放入缓存中并访问:data.get(customerKey).get(dataEntityKey)

你可以找到"复合键"的例子。与#34;多级缓存"在cache2k benchmarks DateFormattingBenchmark

如果你在第一级有一个小集合,这只能很好地工作。在您的情况下,每个客户最终会得到一个单独的缓存,这会花费很多。所以,这只是为了完整性,在你的场景中没有真正的选择。

选项3:使用第二级地图

使用Cache<String, Map<String, JSONObject>构建单个缓存。

如果通常所有客户数据都在短时间内使用,那么在更精细的级别上缓存是没有意义的,因为客户的所有数据通常都会在内存中。另一个例子:当客户不再活动时,缓存将过期,所有客户数据都可以从内存中删除。

更新地图的单个条目会产生正确解决的并发问题,例如:通过在缓存中复制和放置不可变的地图或使用ConcurrentHashMap