程序调用Redis失败超时现象深入剖析(程序调用redis超时)
Redis(Remote Dictionary Server)是一个开源的,基于内存的键值数据库,可以用于存储键值对数据,它也被用于开发应用程序,而程序调用Redis过程中有可能出现超时现象,本文通过深入剖析从而找出原因,以便能够解决这个问题。
我们看下Redis的官方文档“Timeouts”部分,其中明确指出Redis支持两种客户端超时,连接超时(connect timeout)和命令超时(command timeout)。连接超时发生在客户端连接服务器的过程中,包括建立TCP连接请求的阶段(发送SYN包,接收ACK)以及握手完毕之后,就算准备发送命令数据也没完成,整个过程也会受到限制;
另一方面,命令超时发生在客户端发送完命令请求到服务器以后,服务器完成请求并返回结果的整个过程。
除此之外,在编写程序的时候,工程师也要注意网络延迟等问题,一般情况下,应该设置connect timeout 为网络延时的两倍。另外,将Redis设置为Sentinel实例时,Sentinel对寻找Master节点也会有一定的时间消耗,应在connect timeout时间内设置恰当的值。
另外,很多时候,不良的程序写法也会导致程序调用Redis失败,比如程序中连接池未被释放或未正确释放,这可能导致程序调用Redis出现超时现象。开发和运维工程师都要注意连接池的管理,避免连接池的存在导致Redis的超时错误,一般可以通过如下的代码实现:
// 释放连接
try { if (myRedis != null) {
myRedis.close(); }
} catch (Exception e) {
logger.info("释放连接失败"); e.printStackTrace();
}finally {
myRedis = null;}
总结而言,我们可以根据上面的分析,判断出程序调用Redis失败的超时现象究竟是由哪一方造成的,从而将失败溯源,解决掉超时问题。
相关文章