from redis import StrictRedis
redis = StrictRedis(host="192.168.0.111",
port=6380,
db=13,
socket_connect_timeout=0.001)
def connect(self):
if self._sock: # 如果连接已存在,则直接返回
return
try:
sock = self._connect()
except socket.timeout: # 此处即捕获socket的timeout异常
raise TimeoutError("Timeout connecting to server")
def _connect(self):
"Create hardware TCP socket connection"
"""此处即实际Redis使用socket进行tcp连接的方法,在此处会在连接超时时抛出异常"""
err = None
for res in socket.getaddrinfo(self.host, self.port, self.socket_type,
socket.SOCK_STREAM):
family, socktype, proto, canonname, socket_address = res
sock = None
try:
sock = socket.socket(family, socktype, proto)
# TCP_NODELAY
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
# TCP_KEEPALIVE
if self.socket_keepalive:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
for k, v in iteritems(self.socket_keepalive_options):
sock.setsockopt(socket.IPPROTO_TCP, k, v)
# set the socket_connect_timeout before we connect
sock.settimeout(self.socket_connect_timeout)
# connect
sock.connect(socket_address)
# set the socket_timeout now that we're connected
sock.settimeout(self.socket_timeout)
return sock
except socket.error as _:
err = _
if sock is not None:
sock.close()
if err is not None:
raise err # 此处抛出实际连接异常的错误信息
raise socket.error("socket.getaddrinfo returned an empty list")