Infinispan 8 - cache.clear() - 如何正确理解 javadoc?

Jan*_*ing 1 java caching infinispan

在 infinispan 8.2.5.Final 我有一个用例,我想从缓存中逐出/清除所有条目。我正在调用 cache.clear()。Javadoc 说:

void org.infinispan.Cache.clear()

从缓存中删除所有映射。

注意:除非您可以保证不会同时运行其他调用,否则永远不应在生产中调用它

如果缓存是事务性的,它不会与事务交互。

指定者:map 中的 clear()

这是否意味着“没有其他调用 cache.clear()”?或者它是否意味着“根本没有其他底层缓存调用”?所以不能同时使用 cache.put 和 cache.get 吗?

它是清除缓存的常见用例(新数据进入)。我是否使用了错误的方法?是否有其他方法可以从 infinispan 缓存中逐出所有项目?

编辑:我在失效模式下运行我的缓存。clear() 操作是使所有节点中的所有条目无效还是仅使本地节点中的所有条目无效?

pru*_*ivo 5

这意味着“不能运行其他写操作”。将clear()可能会损坏并行写操作(可以在某些节点上应用,但缺少另一个),因为它并不试图获取任何锁定。

如果您担心并发写入,则可以使用stream()iterator()。举个例子:

cache.keySet().stream().forEach(BasicCache::remove);
Run Code Online (Sandbox Code Playgroud)

或者

for (Iterator<K> it = cache.keySet().iterator(); it.hasNext(); ) {
    it.next();
    it.remove();
}
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩。

  • clear() 转到所有节点。您可以使用 CACHE_MODE_LOCAL 标志将其强制到本地节点。示例:cache.getAdvancedCache().withFlags(CACHE_MODE_LOCAL).clear() 注意迭代器/流在所有节点中迭代。您可以使用相同的标志来迭代仅本地键。 (2认同)