Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RedisClusterClient,一个连接或每个线程一个连接_Java_Multithreading_Lettuce - Fatal编程技术网

Java RedisClusterClient,一个连接或每个线程一个连接

Java RedisClusterClient,一个连接或每个线程一个连接,java,multithreading,lettuce,Java,Multithreading,Lettuce,我正在尝试决定是跨多个线程使用多个有状态连接,还是只重用一个线程。我正在使用java 尽管它说对于StatefulRedisClusterConnectionImpl,连接对于Redis群集是线程安全的,并且多个线程可能共享一个连接,但当每个线程使用一个连接时,我获得了更好的性能结果 这是我的代码测试代码: final int THREADS = 5; List<RedisAdvancedClusterCommands<String, String>> cmdLIst =

我正在尝试决定是跨多个线程使用多个有状态连接,还是只重用一个线程。我正在使用java

尽管它说对于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();
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连接。