在 infinispan 中基于谓词删除缓存条目的最佳方法?
Best way to remove cache entry based on predicate in infinispan?
如果缓存中的键匹配某种模式,我想删除一些缓存条目。
例如,我在缓存中有以下键值对,
("key-1", "value-1"), ("key-2", "value-2"), ("key-3", "value-3"), ("key-4", "value-4")
由于cache实现了map接口,我可以这样
cache.entrySet().removeIf(entry -> entry.getKey().indexOf("key-") > 0);
在 infinispan 中是否有更好的方法(可能使用功能流或缓存流 api)?
entrySet 上的 removeIf 方法应该可以正常工作。尽管对于分布式缓存来说它会非常慢,因为它会拉下缓存中的每个条目并在本地评估谓词,然后为每个匹配的条目执行删除。即使在复制缓存中,它仍然必须执行所有删除调用(至少迭代器将是本地的)。由于我们已经在更新 Map 方法,因此将来可能会更改此方法 [a].
另一种选择是使用函数 API,如您所说 [1]。不幸的是,它的实现方式是它仍然会首先在本地提取所有条目。如果 Functional Map API 变得更流行,这可能会在以后更改。
另一种选择是缓存流 API,它使用起来可能有点麻烦,但会为您提供所有选项中的最佳性能。很高兴你提到它 :) 我建议首先应用任何中间操作(幸运的是,在你的情况下你可以使用过滤器,因为你的键不会同时改变)。然后使用传递该节点 [2] 上的缓存的 forEach 终端操作(注意这是一个覆盖)。在 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()));
您也可以使用索引来避免容器的迭代,但我不会在这里深入探讨。索引是一个完全不同的野兽。
如果缓存中的键匹配某种模式,我想删除一些缓存条目。
例如,我在缓存中有以下键值对,
("key-1", "value-1"), ("key-2", "value-2"), ("key-3", "value-3"), ("key-4", "value-4")
由于cache实现了map接口,我可以这样
cache.entrySet().removeIf(entry -> entry.getKey().indexOf("key-") > 0);
在 infinispan 中是否有更好的方法(可能使用功能流或缓存流 api)?
entrySet 上的 removeIf 方法应该可以正常工作。尽管对于分布式缓存来说它会非常慢,因为它会拉下缓存中的每个条目并在本地评估谓词,然后为每个匹配的条目执行删除。即使在复制缓存中,它仍然必须执行所有删除调用(至少迭代器将是本地的)。由于我们已经在更新 Map 方法,因此将来可能会更改此方法 [a].
另一种选择是使用函数 API,如您所说 [1]。不幸的是,它的实现方式是它仍然会首先在本地提取所有条目。如果 Functional Map API 变得更流行,这可能会在以后更改。
另一种选择是缓存流 API,它使用起来可能有点麻烦,但会为您提供所有选项中的最佳性能。很高兴你提到它 :) 我建议首先应用任何中间操作(幸运的是,在你的情况下你可以使用过滤器,因为你的键不会同时改变)。然后使用传递该节点 [2] 上的缓存的 forEach 终端操作(注意这是一个覆盖)。在 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()));
您也可以使用索引来避免容器的迭代,但我不会在这里深入探讨。索引是一个完全不同的野兽。