2017-05-26 165 views
1

我想決定是否跨多個線程使用多個狀態連接或只重用一個。我正在使用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的首選方式。

回答

2

生菜連接是線程安全的。一個連接可以在多個線程之間共享。只有當您使用事務(不適用於Redis羣集)或阻止Redis命令(如BLPOP,BRPOP)時,您不應共享連接的唯一例外情況。

甲Redis的簇連接創建高達

1+(n*2)

永久TCP連接,其中n是Redis的羣集節點的數量。

如果每個應用程序實例有一個小羣集和合理數量的線程,則可以應用每個線程模式的連接。如果您的羣集/應用程序規模達到了無法連接數量的大小,那麼您可能會被迫爲每個應用程序實例使用連接。

通常,使用單個連接涉及的資源較少。一旦命令被調用,默認流水線操作模式就從調用線程發送命令 - 連接不會等到上一個命令完成。

+0

你認爲什麼是「小型集羣」,我們有4臺機器,採用這種設置: 1 :(M1 S2 S3 S4),2:(M2 S1 S3 S4),3:(M3),4: (M4)。這就是10個redis集羣節點,意思是通過公式運行的21個TCP連接 –

+1

小型和大型主要取決於感知和資源可用性。在您的羣集中,每個Redis羣集連接最多可創建21個TCP連接。如果您有一個線程綁定連接的10個併發線程在單個JVM中具有210個TCP連接。如果運行10個應用程序實例,則總共可以獲得2100個連接,從而在每個Redis集羣節點上產生大約200到210個TCP連接。 – mp911de