并行写入 Ehcache 有危险吗?
Are There Dangers to Writing to Ehcache in Parallel?
在给定的示例中,我有一个内部 class,它在想象的 ExampleCache
class 内部定义了一个通读 CacheLoaderWriter
,它将抽象缓存操作,因此第 3 方只是认为他们正在访问数据结构(键值对)。我的问题涉及 loadAll
方法。
如果loadAll
写成并行写入EhCache,会不会有记录变异或不稳定的风险? EhCache 是为处理用户定义的并发而构建的吗?
class ExampleCacheLoader implements CacheLoaderWriter<String, ArrayList> {
private HashMap<String, ArrayList> map;
public CacheLoader() {
map = new HashMap<>();
}
@Override
public ArrayList<String> load(String s) throws Exception {
Map.Entry<String, ArrayList<String>> personEntry = getPersonAliases(s);
if(!map.containsKey(personEntry.getKey())){
map.put(personEntry.getKey(), personEntry.getValue());
}
return map.get(personEntry.getKey());
}
@Override
public Map<String, ArrayList> loadAll(
Iterable<? extends String> keys) throws Exception {
Map<String, ArrayList> localTempMap = new HashMap<>();
Stream keyStream = StreamSupport.stream(entries.spliterator(), true);
keyStream.forEach(key -> {
localTempMap.putIfAbsent(
getterExample(key).getKey(),
getterExample(key).getValue());
});
map.putAll(localTempMap);
return localTempMap;
}
.
.
.
Ehcache 是一个为并发访问而设计的库,因此以最佳方式处理多线程、并发突变和相关问题。
现在您对 CacheLoaderWriter
的理解似乎有问题。您不应该从 CacheLoaderWriter
访问缓存,而是 CacheLoaderWriter
将在需要时由缓存访问,即当请求映射但未在中找到时 load*
方法缓存。
然而,您的 CacheLoaderWriter
实现 必须是 线程安全的,因为 Ehcache 将同时使用它。此外,在您提议的实施中,您在 CacheLoaderWriter
内维护状态,这与 Cache
将执行的操作是多余的......如果我理解正确你想要实现的目标。
在给定的示例中,我有一个内部 class,它在想象的 ExampleCache
class 内部定义了一个通读 CacheLoaderWriter
,它将抽象缓存操作,因此第 3 方只是认为他们正在访问数据结构(键值对)。我的问题涉及 loadAll
方法。
如果loadAll
写成并行写入EhCache,会不会有记录变异或不稳定的风险? EhCache 是为处理用户定义的并发而构建的吗?
class ExampleCacheLoader implements CacheLoaderWriter<String, ArrayList> {
private HashMap<String, ArrayList> map;
public CacheLoader() {
map = new HashMap<>();
}
@Override
public ArrayList<String> load(String s) throws Exception {
Map.Entry<String, ArrayList<String>> personEntry = getPersonAliases(s);
if(!map.containsKey(personEntry.getKey())){
map.put(personEntry.getKey(), personEntry.getValue());
}
return map.get(personEntry.getKey());
}
@Override
public Map<String, ArrayList> loadAll(
Iterable<? extends String> keys) throws Exception {
Map<String, ArrayList> localTempMap = new HashMap<>();
Stream keyStream = StreamSupport.stream(entries.spliterator(), true);
keyStream.forEach(key -> {
localTempMap.putIfAbsent(
getterExample(key).getKey(),
getterExample(key).getValue());
});
map.putAll(localTempMap);
return localTempMap;
}
.
.
.
Ehcache 是一个为并发访问而设计的库,因此以最佳方式处理多线程、并发突变和相关问题。
现在您对 CacheLoaderWriter
的理解似乎有问题。您不应该从 CacheLoaderWriter
访问缓存,而是 CacheLoaderWriter
将在需要时由缓存访问,即当请求映射但未在中找到时 load*
方法缓存。
然而,您的 CacheLoaderWriter
实现 必须是 线程安全的,因为 Ehcache 将同时使用它。此外,在您提议的实施中,您在 CacheLoaderWriter
内维护状态,这与 Cache
将执行的操作是多余的......如果我理解正确你想要实现的目标。