laravel使用redis监听在内部再次使用redis遇到的问题

问题一:启用监听收不到过期时间消息,原因是未开启配置
解决办法是 在redis配置文件内开启 notify-keyspace-events Ex或者在redis命令行 redis-cli 使用命令:

config set notify-keyspace-events Ex

问题二:PredisConnectionConnectionException : Error while reading line from the server

原因是Redis默认链接时间未60秒,在database.php设置read_write_timeout为0即可。

"read_write_timeout"=>0

问题三:ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT allowed in this context
这个是因为一个Redis链接使用监听时,无法使用其他命令。需要重新建立一个链接。期初我使用 new \Predis\Client(),一直报错,我也不知道为啥。然后我想到了使用集群,使用相同配置。将监听事件设置为单独实例。具体操作如下:

//datebase.php配置页面
'redis' => [
        'client' => 'predis',
        'default' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
            "queue" => '{default}',//queue站点默认走的redis
        ],
        'publisher' => [ //redis 订阅监听
                    'host' => env('REDIS_HOST', '127.0.0.1'),
                    'password' => env('REDIS_PASSWORD', null),
                    'port' => env('REDIS_PORT', 6379),
                    'database' => 0,
                    "read_write_timeout"=>0,//长连接不要断
                ],
           ]
//监听页面
//__keyevent@*__:expired监听过期消息
$redis=Redis::connection('publisher');//创建新的实例
$redis->psubscribe(['__keyevent@*__:expired'], function ($message, $channel) {
   echo $message;
   Redis::set('aa','123');//这样就不会报错了。这里使用的是default的,是两个redis链接。
});

相关推荐