jedis的socket设置

894 阅读2分钟

先来看代码,redis.clients.jedis.Connection

 1public void connect() {
2    if (!isConnected()) {
3        try {
4            socket = new Socket();
5            // ->@wjw_add
6            socket.setReuseAddress(true);
7            socket.setKeepAlive(true); // Will monitor the TCP connection is
8            // valid
9            socket.setTcpNoDelay(true); // Socket buffer Whetherclosed, to
10            // ensure timely delivery of data
11            socket.setSoLinger(true0); // Control calls close () method,
12            // the underlying socket is closed
13            // immediately
14            // <-@wjw_add
15
16            socket.connect(new InetSocketAddress(host, port), connectionTimeout);
17            socket.setSoTimeout(soTimeout);

别看只有简简单单几个设置,每个都很必要,下面来一一说明:

socket.setReuseAddress(true), 设置端口重用,当一个tcp链接被关闭时,被动方会进入TIME_WAIT阶段,而端口会因为被这种处于timeout状态的连接占用而无法提供给其他连接。这个设置就是允许系统把这种被timeout状态连接占用的端口也作为bind()操作的候选端口。同时也增加了端口复用的效率。需要注意的是这个需要在bind()操作前设置,在之后设置就没用了 。 socket.setKeepAlive(true),不会主动关闭tcp连接。减少tcp频繁建立和关闭带来的开销。 socket.setTcpNoDelay(true),socket buffer是否关闭,设置了这个后可以有效减少tcp传输的延迟。设置为false会开启nagle算法。 socket.setSoLinger(true, 0),设置了当服务端关闭连接时,jedis作为客户端是否应该flush buffer数据,如果不开启soLinger,则会flush buffer数据。如果开启soLinger并设置>0的超时时间,则在超过超时时候后会自动关掉连接。如果设置超时时间为0,代表当连接被断开时马上关闭,不flush buffer数据。