Java RedisClusterClient,一个连接或每个线程一个连接
我正在尝试决定是跨多个线程使用多个有状态连接,还是只重用一个线程。我正在使用java 尽管它说对于StatefulRedisClusterConnectionImpl,连接对于Redis群集是线程安全的,并且多个线程可能共享一个连接,但当每个线程使用一个连接时,我获得了更好的性能结果 这是我的代码测试代码:Java RedisClusterClient,一个连接或每个线程一个连接,java,multithreading,lettuce,Java,Multithreading,Lettuce,我正在尝试决定是跨多个线程使用多个有状态连接,还是只重用一个线程。我正在使用java 尽管它说对于StatefulRedisClusterConnectionImpl,连接对于Redis群集是线程安全的,并且多个线程可能共享一个连接,但当每个线程使用一个连接时,我获得了更好的性能结果 这是我的代码测试代码: final int THREADS = 5; List<RedisAdvancedClusterCommands<String, String>> cmdLIst =
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();
final int THREADS=5;
List cmdLIst=新建LinkedList();
对于(int j=0;j
InsertClass
扩展Thread
我在使用
cmd
和cmdLIst
之间切换,前者为所有线程重用连接,后者为每个连接使用自己的连接。
我的设置是4台远程(代码与redis群集不在同一台机器上运行)机器(+从机)上的4台主机每个线程对随机键执行80kset操作,对这些相同的键执行80kget操作。我也试着做同样的事情,但是使用了一个键(一个键的设置为80k,同一个键的设置为80k,所有线程的设置为80k)。 结果总是一样的,当使用多个连接(每个线程一个连接)时,我得到大约20秒的差异(95秒对115秒)
当每个线程使用一个连接时,是否存在某种缺陷?或者一些我不知道的不期望的结果,因为在我看来,这将是使用此API的首选方式。莴苣连接是线程安全的。单个连接可以跨多个线程共享。只有在使用事务(不适用于Redis群集)或阻止Redis命令(例如
BLPOP
,BRPOP
)时,才不应共享连接
Redis群集连接最多可创建
永久TCP连接,其中n
是Redis群集节点的数量
如果每个应用程序实例有一个小集群和一个合理数量的线程,那么可以应用每个线程连接模式。如果您的群集/应用程序规模达到了一个不合理的连接数,那么您可能会被迫为每个应用程序实例使用一个连接
通常,使用单个连接所涉及的资源较少。默认的流水线操作模式在调用命令后立即从调用线程发送命令–连接不会等到上一个命令完成。连接是线程安全的。单个连接可以跨多个线程共享。只有在使用事务(不适用于Redis群集)或阻止Redis命令(例如
BLPOP
,BRPOP
)时,才不应共享连接
Redis群集连接最多可创建
永久TCP连接,其中n
是Redis群集节点的数量
如果每个应用程序实例有一个小集群和一个合理数量的线程,那么可以应用每个线程连接模式。如果您的群集/应用程序规模达到了一个不合理的连接数,那么您可能会被迫为每个应用程序实例使用一个连接
通常,使用单个连接所涉及的资源较少。默认的流水线操作模式在命令被调用后从调用线程发送命令——连接没有等到一个以前的命令完成。你认为什么是代码<小簇< /代码>,我们有4台机器,这个设置:1(M1 S2 S3 S4),2:(M2 S1 S3 S4),3:(M3),4:(M4)。这是10个redis群集节点,这意味着21个TCP连接按照您的公式运行大小主要取决于感知和资源可用性。在您的群集中,每个Redis群集连接最多可创建21个TCP连接。如果在单个JVM中有10个并发线程和210个TCP连接的线程绑定连接。如果运行10个应用实例,则总共得到2100个连接,这导致每个ReDIS集群节点中大约有200到210个TCP连接。您认为什么是“代码>小簇< /代码>,我们有4台具有此设置的机器:1:(M1 S2 S3 S4),2:(M2 S1 S3 S4),3:(M3),4:(M4)。这是10个redis群集节点,这意味着21个TCP连接按照您的公式运行大小主要取决于感知和资源可用性。在您的群集中,每个Redis群集连接最多可创建21个TCP连接。如果在单个JVM中有10个并发线程和210个TCP连接的线程绑定连接。如果运行10个应用程序实例,则总共会得到2100个连接,这导致每个Redis群集节点上大约有200到210个TCP连接。