Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问按键分组的缓存元素_Java_Performance_Caching - Fatal编程技术网

Java 访问按键分组的缓存元素

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

我希望在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)).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);