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

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

客户名称(密钥,字符串) – 数据实体名称(密钥,字符串) – config-1(值,JSONObject) – config-2(值,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或任何其他库实现这样的多级分层缓存?

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

选项1:构造复合键对象

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

这是非常标准的键/值存储,包括普通地图。 我在cache2k快速入门中解决了这个问题。

选项2:使用多级缓存

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

您可以在cache2k基准测试中找到“Composite Key”与“Multi Level Caches”的示例DateFormattingBenchmark

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

选项3:使用第二级地图

使用Cache构造单个缓存。

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

更新映射的单个条目将具有正确解决所需的并发问题,例如,通过复制并仅将不可变映射放入缓存或使用ConcurrentHashMap