先来看代码,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(true, 0); // 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数据。