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

What is the better option for a multi-level, in-process cache?

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

客户名称(关键字,字符串) --数据实体名称(键,字符串) --config-1(值,JSONObject) --config-2(值,JSONObject)

我计划拥有数百个客户条目,每个条目最多有一百个 "config" 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

更常见

方案一:构造复合键对象

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

这是非常标准的 key/value 商店,包括普通地图。我确实在 cache2k Quick Start.

中解决了这个问题

方案二:使用多级缓存

将缓存放在缓存中并像这样访问:data.get(customerKey).get(dataEntityKey)

您可以在 cache2k benchmarks DateFormattingBenchmark

中找到 "Composite Key" 与 "Multi Level Caches" 的示例

只有当你的第一级有一个小的集合时,这才会很好地工作。在您的情况下,您最终会为每个客户提供一个单独的缓存,这非常昂贵。所以,这只是为了完整性,在您的场景中没有真正的选择。

选项3:第二关使用地图

Cache<String, Map<String, JSONObject>构建一个缓存。

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

更新地图的单个条目将产生您需要正确解决的并发问题,例如通过复制并仅将不可变映射放入缓存或使用 ConcurrentHashMap.