subscribe,p subscribe,publish

发布订阅(pub/sub)跟设计模式中的观察者模式比较相似,不知道观察者模式也不要紧,至少你应该知道事件监听,其实事件监听就是观察者模式的一种实现(比如说对鼠标点击,键盘回车等事件的监听)。

redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的消息时。

订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个 channel,也可以向多个channel发送消息。

这种订阅者和发布者之间的关系是松耦合的,订阅者不知道是谁发布的消息,发布者也不知道谁会接收消息。

redis的发布/订阅功能主要通过SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE、PUNSUBSCRIBE 、PUBLISH五个命令来表现。

其中SUBSCRIBE、UNSUBSCRIBE用于订阅或者取消订阅channel,而PSUBSCRIBE、PUNSUBSCRIBE用于订阅或者取消订阅pattern,发布消息则通过publish命令。

下面做个实验:
1. 先启动你redis-server

2. 启动一个redis-cli订阅一个使用通配符的通道(*表示任意字符串):

xwuxin@xwuxin-forrain:~$ redis-cli
redis 127.0.0.1:6379> psubscribe store.goods.*
Reading messages… (press Ctrl-C to quit)
1) “psubscribe”
2) “store.goods.*”
3) (integer) 1

3. 启动另一个redis-cli:

xwuxin@xwuxin-forrain:~$ redis-cli
redis 127.0.0.1:6379> subscribe store.goods.add_msg
Reading messages… (press Ctrl-C to quit)
1) “subscribe”
2) “store.goods.add_msg”
3) (integer) 1

4.再启动一个redis-cli用来发布消息

xwuxin@xwuxin-forrain:~$ redis-cli
redis 127.0.0.1:6379> publish store.goods.del_msg “delete goods!”
(integer) 1
redis 127.0.0.1:6379> publish store.goods.add_msg “add goods”
(integer) 2

再看前两个redis-cli下已经打印出了收到的相关信息。
发布消息的redis-cli返回的(integer)2表示有两个redis-cli连接收到了此消息。

在php中的使用方式,以下代码依赖于phpredis扩展(注意:不要在网页中运行,会死循环超时的,在php cli下运行才看得到效果,当然时间长了也会溢出。)

$redis = new Redis();
$redis->connect(’127.0.0.1′, 6379);
$redis->subscribe(array(‘store.goods.add_msg’), ‘f’);

function f($redis, $chan, $msg) {

var_dump($msg);

}


发表评论

电子邮件地址不会被公开。 必填项已用*标注