最近学习了一下php-redis相关的知识,其中有一个功能叫发布订阅,Redis 发布订阅(pub/sub)是一种消息通信模式,发送者(pub)发送消息,订阅者(sub)接收消息。
直接上php代码如下:
普通 - 【发送者pub】- pub.php
1 $redis = new Redis(); 2 $redis->connect('127.0.0.1', 6379); 3 $redis->auth('requirepass'); 4 5 $res = $redis->publish('channel', date('Y-m-d H:i:s')); 6 var_dump($res); //成功返回1,失败返回0
普通 - 【订阅者sub】- sub.php
1 $redis = new Redis(); 2 $redis->connect('127.0.0.1', 6379); 3 $redis->auth('requirepass'); 4 $redis->setOption(Redis::OPT_READ_TIMEOUT, -1); 5 6 function callback ($redisObj, $channel, $msg){ 7 echo 'ChannelName is '.$channel.', Msg is '.$msg; //ChannelName is channel, Msg is 2019-07-17 09:53:55 8 } 9 $redis->subscribe(['channel'], 'callback');
这种发送和订阅的原理可以理解成一端发送,另外一端马上收到消息,确切的说就是通过向channel频道发送消息,其他订阅了channel频道的端都可以立马收到消息。
【设置有效期的键值】 - pub.php
1 $job = 'notify#' . date('YmdHis'); 2 $res = $redis->setex($job, 10, 'waiting'); 3 var_dump($res); //成功返回bool(true),失败返回bool(false)
【键空间消息订阅】- sub.php
1 $redisKey = '__keyevent@0__:expired'; //这个格式是固定的,0表示第一个库,redis默认使用第一个库0 2 $redis->psubscribe([$redisKey], 'callBack'); 3 function callBack($redisObj, $pattern, $channel, $msg) { 4 echo $msg." "; //notify#20190717100350 5 }
这种发送和订阅的原理可以理解成当键值过期的时候会自动发送消息,另外一端开启了键空间消息的订阅就可以收到消息了。
特别说明:因为订阅事件启动后是阻塞执行的,所以需要一直挂着终端等待订阅,这种情况只能满足测试开发,如果是实际应用就不行了,这个时候我们希望监听后台始终运行希望像守护进程一样在后台,Linux系统中,可以使用nohup命令,具体用法待续。