Java 访问按键分组的缓存元素
我希望在JCS或Infinispan之类的缓存中使用复合键(String,int)缓存大量Java对象(String,byte[]) 这些键可以按其字符串部分(我们称之为ID)进行分组: 我需要删除按键的ID部分分组的元素,例如A应该删除1、4和5 首先,我尝试了这样的方法:Java 访问按键分组的缓存元素,java,performance,caching,Java,Performance,Caching,我希望在JCS或Infinispan之类的缓存中使用复合键(String,int)缓存大量Java对象(String,byte[]) 这些键可以按其字符串部分(我们称之为ID)进行分组: 我需要删除按键的ID部分分组的元素,例如A应该删除1、4和5 首先,我尝试了这样的方法: final List<String> keys = cache.keySet() .stream().filter(k -> k.getId().equals(id)).co
final List<String> keys = cache.keySet()
.stream().filter(k -> k.getId().equals(id)).collect(Collectors.toList());
keys.forEach(cache::remove);
删除组是非常有效的:
cache.remove(id);
但推杆需要一个get:
Map<Integer, Value> map = cache.get(key.getId());
if (map == null) {
map = new HashMap<>();
}
map.put(key.getInt(), value);
cache.put(key.getId(), map);
Map=cache.get(key.getId());
if(map==null){
map=新的HashMap();
}
map.put(key.getInt(),value);
cache.put(key.getId(),map);
现在缓存中的元素更少,键更简单,但值更大、更复杂。通过测试缓存中的数十万个元素,删除速度很快,而且put和get似乎没有明显的慢
这是一个有效的解决方案还是有更好的方法?我建议您使用
computeifassent
并保存一个put-and-get调用,如下所示:
cache.computeIfAbsent(key.getId(), k -> new HashMap<Integer,Value>()).put(key.getInt(),value);
cache.computeIfAbsent(key.getId(),k->newhashmap()).put(key.getInt(),value);
此方法确保仅当次映射尚未映射到主映射中时才创建次映射,并且由于它返回映射到主键的次映射,因此不需要额外的get调用
参考资料:
Map<Integer, Value> map = cache.get(key.getId());
if (map == null) {
map = new HashMap<>();
}
map.put(key.getInt(), value);
cache.put(key.getId(), map);
cache.computeIfAbsent(key.getId(), k -> new HashMap<Integer,Value>()).put(key.getInt(),value);