在我的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或任何其他库实现这样的多级分层缓存?
答案 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
。