一尘不染

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

spring-boot

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

客户名称(键,字符串)-数据实体名称(键,字符串)–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”,并使用“我的顾客”代替“ value1”,但是我需要建立一个层次结构:

customer
 -data entity
   -config

我不确定如何使用ehcache。我也不确定我尝试做的事情是否有更好的选择。

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


阅读 327

收藏
2020-05-30

共1个答案

一尘不染

为了便于说明,我使用了类似地图的缓存:value = Cache.get(key)比EHCache2更常见Element

选项1:构造复合键对象

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

这是相当标准的键/值存储库,包括纯地图。我确实在cache2k快速入门中解决了这个问题。

选项2:使用多级缓存

将一个缓存放入一个缓存中,并进行如下访问:data.get(customerKey).get(dataEntityKey)

您可以在cache2k基准测试DateFormattingBenchmark中找到“复合键”与“多级缓存”的示例

仅当您在第一级有少量设置时,这才可以很好地工作。在您的情况下,您最终将为每个客户提供单独的缓存,这将导致成本高昂。因此,这仅出于完整性考虑,在您的方案中没有实际选择。

选项3:将地图用于第二层

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

如果通常在短时间间隔内使用所有客户数据,则在更细的级别上进行缓存是没有意义的,因为客户的所有数据通常都会存储在内存中。另一个示例:当客户不再处于活动状态时,缓存将过期,并且可以从内存中删除所有客户数据。

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

2020-05-30