多级进程内缓存的更好选择是什么?
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
.
在我的 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
.