我在3节点设置中使用Infinispan 6.0.0(每个条目有2个副本的分布式缓存,没有写入持久存储)并且我只是逐行读取文件并存储该行'内容进入缓存。速度对我来说似乎有点低(我可以在SSD上实现更多写入(持久存储)而不是使用Infinispan进行RAM),但测试代码中没有任何明显的瓶颈(我使用的是缓冲输入流,并且他们的限制当然没有达到。至于现在,我能够每次约45秒写入100K条目,这对我不满意。假设简化的代码片段:
while ((s = reader.readLine()) != null) {
cache.put(s.substring(0,2), s.substring(2,5));
}
CacheManager
创建如下:
return new DefaultCacheManager(
GlobalConfigurationBuilder.defaultClusteredBuilder()
.transport().addProperty("configurationFile", "jgroups.xml").build(),
new ConfigurationBuilder()
.clustering().cacheMode(CacheMode.DIST_ASYNC).hash().numOwners(2)
.transaction().transactionMode(TransactionMode.TRANSACTIONAL).lockingMode(LockingMode.OPTIMISTIC)
.build());
我可能做错了什么?
答案 0 :(得分:1)
我并不完全了解所有异步模式专业,但我担心两阶段提交(准备和提交)中的某些内容可能会强制阻止RPC =>等待网络延迟=>慢下来。
您需要交易行为吗?如果没有,请关闭它们。如果您确实需要它,则可以仅禁用自动提交功能并通过非事务性操作加载群集。或者,您可以尝试一个阶段提交。
另一种选择可能是通过putAll进行批量加载(有数十或数百个条目,取决于您的条目大小),但此消息的路由并不是很聪明。在交易模式中,我猜它会表现得更好。
最后一个选项,如果您只是想快速加载集群然后对其进行操作,可以将批量数据传输到每个节点而不使用Infinispan(使用您自己的JGroups通道,或仅使用套接字),并使用CACHE_MODE_LOCAL标志。
答案 1 :(得分:1)
默认情况下,Infinispan遵循返回先前值的Map.put()
合约,因此即使您使用的是DIST_ASYNC
缓存模式,您仍然会隐式执行每个放置的同步cache.get()
您可以通过两种方式避免这种情况:
configurationBuilder.unsafe().unreliableReturnValues(true)
将禁止远程查找缓存中的所有操作。cache.getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES).put(k, v)
将禁止单个操作的远程查找。