使用php脚本循环消费队列时,redis报错redisException: Connection lost

1075494419 发布于 2018/03/12 11:50
阅读 1K+
收藏 1

因为使用rabbitmq队列循环消费,也就是while true, php脚本一直运行,同时连接redis时使用的是单例,不会每次都重新new。然后redis连接过一段时间(大概一个小时)后会由established状态变为close_wait状态。然后队列有数据,开始消费时,调用redis就会抛出异常redisException: Connection lost in xxxxxxx;

    初步猜测是因为,redis连接长时间无数据交互,而服务端主动关闭连接导致的,只是猜测,请问到底是什么原因,有遇到过的么?

加载中
0
意简美
意简美

重新连接一下吧,我以前也遇到过。redis有个连接时间 看看是不是超时了

1075494419
1075494419
可是我们的dba说redis不设置超时时间,默认为0,我测试了一下,确实一个redis连接放sleep好几个小时再调用也是正常的。 但是在线上脚本使用的时候就会出现close_wait状态,然后消费脚本就挂掉了。应该是服务器主动关闭连接了,但不知道可能的原因还有啥
0
意简美
意简美
class Redis
{
    /**
     * @var \Redis
     */
    private static $redis = null;

    private static $start_time = 0;

    private static $max_connect_time = 600;

    private function __construct()
    {

    }

    /**
     * @return \Redis
     */
    public static function connect(){
        if(self::$redis === null || self::$start_time + self::$max_connect_time < time()) {
            if(self::$redis){
                self::$redis->close();
                self::$redis = null;
            }
            self::$start_time = time();
            self::$redis = new \Redis();
            $conf = \App::config('Cache.redis');
            self::$redis->connect($conf['host'], $conf['port'],0);
        }
        return self::$redis;
    }

}

//调用
Redis::connect()->get

 

0
帝江
帝江

我遇到的是mysql.应该类似.如果变量还在.但实际断开的话.重新初始化一下吧...

0
蒜苔888
蒜苔888

当时我们也遇到这个情况,建议你写shell脚本,

返回顶部
顶部