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

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

config set notify-keyspace-events Ex

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

缘由是Redis默认连接时间未60秒,在database.php设置read_write_timeout为0便可。this

"read_write_timeout"=>0

问题三:ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT allowed in this context
这个是由于一个Redis连接使用监听时,没法使用其余命令。须要从新创建一个连接。期初我使用 new \Predis\Client(),一直报错,我也不知道为啥。而后我想到了使用集群,使用相同配置。将监听事件设置为单独实例。具体操做以下:spa

//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连接。
});
相关文章
相关标签/搜索