如果缓存中的键与某些模式匹配,我希望删除几个缓存条目。
例如,缓存中有以下键值对,
("key-1", "value-1"), ("key-2", "value-2"), ("key-3", "value-3"), ("key-4", "value-4")由于cache实现了映射接口,所以我可以这样做
cache.entrySet().removeIf(entry -> entry.getKey().indexOf("key-") > 0);是否有更好的方法在无穷大范围内(可能正在使用函数式或高速缓存流api)来做到这一点?
发布于 2017-04-18 16:43:31
removeIf方法在entrySet上应该工作得很好。但是对于分布式缓存来说,它将非常慢,因为它将在本地提取缓存中的每个条目并计算谓词,然后对匹配的每个条目执行一个remove。即使在复制的缓存中,它仍然必须执行所有的删除调用(至少迭代器将是本地的)。当我们正在更新Map方法时,这个方法可能会在将来被更改。
另一种选择是像您所说的那样使用functional。不幸的是,它的实现方式仍然是首先在本地提取所有条目。如果Functional变得更受欢迎,这可能会在以后的某个时候被更改。
另一个选择是缓存流API,它使用起来可能有点麻烦,但它将为您提供所有选项中最好的性能。很高兴您提到了这一点:)我建议您首先应用任何中间操作(幸运的是,在您的情况下,您可以使用筛选器,因为您的键不会并发更改)。然后使用forEach终端操作,它在该节点2上传递缓存。在可调用的forEach中,您可以按需要调用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()));您也可以使用索引来避免容器的迭代,但是这里不讨论这个问题。索引是完全不同的东西。
https://stackoverflow.com/questions/43463011
复制相似问题