如果缓存中的密钥与某种模式匹配,我想删除一些缓存条目。
例如,我在缓存中有以下键值对,
("key-1", "value-1"), ("key-2", "value-2"), ("key-3", "value-3"), ("key-4", "value-4")
由于缓存实现了一个地图界面,我可以这样做
cache.entrySet().removeIf(entry -> entry.getKey().indexOf("key-") > 0);
有没有更好的方法在infinispan中执行此操作(可能使用功能或缓存流API)?
答案 0 :(得分:2)
entrySet上的removeIf方法应该可以正常工作。对于分布式缓存,它将非常缓慢,因为它将下拉缓存中的每个条目并在本地评估谓词,然后对匹配的每个条目执行删除。即使在复制的缓存中,它仍然必须执行所有的删除调用(至少迭代器将是本地的)。今后可能会更改此方法,因为我们正在更新Map方法[a]。
另一种选择是使用功能API,如你所说[1]。不幸的是,实现它的方式是它仍将首先在本地拉出所有条目。如果功能映射API变得更受欢迎,可能会在以后更改。
另一个选择是缓存流API,使用起来可能稍微麻烦一些,但会为您提供所有选项的最佳性能。很高兴你提到它:)我建议首先应用任何中间操作(幸运的是,你可以使用过滤器,因为你的密钥不会同时改变)。然后使用forEach终端操作,该操作在该节点上传递Cache [2](注意这是一个覆盖)。在forEach callable中,您可以根据需要调用remove命令。
cache.entrySet().parallelStream() // stream() if you want single thread per node
.filter(e -> e.getKey().indexOf("key-") > 0)
.forEach((cache, e) -> cache.remove(e.getKey()));
你也可以使用索引来避免容器的迭代,但我不会在这里讨论。索引是一个完全不同的野兽。