在我的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或任何其他库实现了这样的多级分层缓存?
为了便于说明,我使用了类似地图的缓存:value = Cache.get(key)比EHCache2更常见Element
value = Cache.get(key)
Element
选项1:构造复合键对象
class CustomerConfigurationKey { String customerKey; String dataEntityKey; // equals() and hashCode() }
这是相当标准的键/值存储库,包括纯地图。我确实在cache2k快速入门中解决了这个问题。
选项2:使用多级缓存
将一个缓存放入一个缓存中,并进行如下访问:data.get(customerKey).get(dataEntityKey)。
data.get(customerKey).get(dataEntityKey)
您可以在cache2k基准测试DateFormattingBenchmark中找到“复合键”与“多级缓存”的示例
仅当您在第一级有少量设置时,这才可以很好地工作。在您的情况下,您最终将为每个客户提供单独的缓存,这将导致成本高昂。因此,这仅出于完整性考虑,在您的方案中没有实际选择。
选项3:将地图用于第二层
使用构建单个缓存Cache<String, Map<String, JSONObject>。
Cache<String, Map<String, JSONObject>
如果通常在短时间间隔内使用所有客户数据,则在更细的级别上进行缓存是没有意义的,因为客户的所有数据通常都会存储在内存中。另一个示例:当客户不再处于活动状态时,缓存将过期,并且可以从内存中删除所有客户数据。
更新映射的单个条目将具有您需要正确解决的并发问题,例如,通过在缓存中仅复制并放置不可变的映射或使用ConcurrentHashMap。
ConcurrentHashMap