我想決定是否跨多個線程使用多個狀態連接或只重用一個。我正在使用java。RedisClusterClient,每個線程一個連接或一個連接
儘管它表示StatefulRedisClusterConnectionImpl表示連接對於Redis集羣是線程安全的,並且多個線程可能共享一個線程,但在每個線程使用一個連接時,性能結果會更好。
這是我的代碼測試代碼:
final int THREADS = 5;
List<RedisAdvancedClusterCommands<String, String>> cmdLIst = new LinkedList<>();
for (int j = 0; j < THREADS; j++) {
cmdLIst.add(redisClient.connect().sync());
}
RedisAdvancedClusterCommands<String, String> cmd = redisClient.connect().sync();
HashMap<Integer, List<String>> keysPerNode = new HashMap<>();
for (int i = 0; i < THREADS; i++) {
List<String> keys = generateKeys();
keysPerNode.put(i, keys);
Thread insertThread = new InsertClass(cmd, keys, startLatch, endLatch);
//Thread insertThread = new InsertClass(cmdLIst.get(i), keys, startLatch, endLatch);
insertThread.setName("Insert thread(" + i + ")");
insertThread.start();
}
Thread.sleep(5000);
for (int j = 0; j < THREADS; j++) {
startLatch.countDown();
}
long start = System.currentTimeMillis();
endLatch.await();
printElapsed((System.currentTimeMillis() - start)/1000);
cmdLIst.forEach(RedisClusterCommands::close);
cmd.close();
InsertClass
延伸Thread
。
我之間轉移使用cmd
其中我重用連接所有線程和使用cmdLIst
其中每個連接使用它自己的連接。 我的設置是4個遠程主機上的代碼(代碼不在與redis羣集相同的機器上運行)機器(+從機)。
每個線程執行80k 設置操作爲隨機密鑰和比80k 得到操作爲這些相同的密鑰。此外,我試圖做同樣的事情,但與1鍵(80k 集的那一鍵+ 80k 得到的同一個關鍵,所有線程相同的鍵)。 結果總是相同的,當使用多個連接(每個線程1個連接)時,我獲得20秒左右的差異(95秒vs 115秒)。
每個線程使用一個連接有什麼缺點嗎?或者我不知道的一些不良後果,因爲在我看來,這將是使用此API的首選方式。
你認爲什麼是「小型集羣」,我們有4臺機器,採用這種設置: 1 :(M1 S2 S3 S4),2:(M2 S1 S3 S4),3:(M3),4: (M4)。這就是10個redis集羣節點,意思是通過公式運行的21個TCP連接 –
小型和大型主要取決於感知和資源可用性。在您的羣集中,每個Redis羣集連接最多可創建21個TCP連接。如果您有一個線程綁定連接的10個併發線程在單個JVM中具有210個TCP連接。如果運行10個應用程序實例,則總共可以獲得2100個連接,從而在每個Redis集羣節點上產生大約200到210個TCP連接。 – mp911de