浅析redis的订阅发布功能及其应用场景!!

171 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

一、适用场景

1、通过redis的订阅与发布可以实现实时通讯的系统。

2、通过redis的订阅月发布可以实现类似于观察者模式的需求。

3、微服务之间可以通过订阅发布的功能通知别的模块触发某些事件的功能。

二、发布及订阅的功能

  1. 基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。
  2. 消息发布者,即publish客户端,无需独占链接,你可以在publish消息的同时,使用同一个redis-client链接进行其他操作(例如:INCR等)
  3. 消息订阅者,即subscribe客户端,需要独占链接,即进行subscribe期间,redis-client无法穿插其他操作,此时client以阻塞的方式等待“publish端”的消息;这一点很好理解,因此subscribe端需要使用单独的链接,甚至需要在额外的线程中使用。

三、发布端的代码

<?php
/**
 * redis sub(消息订阅端)
 */
$redis = new Redis();
// 第一个参数为redis服务器的ip,第二个为端口
$res = $redis->connect('121.41.88.209', 6379);
// test为发布的频道名称,hello,world为发布的消息
$res = $redis->publish('test','hello,world'.rand(00000,99999));

四、订阅端的代码

<?php
/**
 * redis sub(消息订阅端)
 */
$redis = new Redis();
$res = $redis->pconnect('121.41.88.209', 6379);
$redis->setOption(\Redis::OPT_READ_TIMEOUT,-1);
$redis->subscribe(array('test'), 'callback');


// 回调函数,这里写处理逻辑
function callback($instance, $channelName, $message)
{
 echo $channelName, "==>", $message,PHP_EOL;
}
  • 如果请求发布端的请求太多就会存在并发的问题,解决这个问题我们可以适用redis的队列消息的技术来解决,把发布的信息保存在redis的队列里面,然后启动一个定时器,每隔一段时间就去队列里面取数据再出发发布端的代码进行发布。

谢谢观看!streetlamp敬上!