订阅和发布的介绍以及原理在redis设计与实现以及讲述清楚,这里就不啰嗦了。我们的任务主要还是根据原理来分析源码。先来看下订阅和发布会用到的结构体:
struct redisServer {
......
dict *pubsub_channels; /* Map channels to list of subscribed clients */
list *pubsub_patterns; /* A list of pubsub_patterns */
......
}
有事redisServer中,可以看出redisServer这个结构体在redis中的作用是非常重要的。从上述结构中可以看出redis订阅有两种方式:订阅到频道和订阅到模式(redis设计与实现也讲过)。订阅到频道使用的是字典(字典会在后面讲到),而订阅到模式用到的是链表。这两种订阅方式使用的命令是不相同的。订阅到频道用的是SUBSCRIBE,而订阅到模式用的是PSUBSCRIBE。
首先从subscribe看起,subscribe调用的是subscribeCommand:
void subscribeCommand(redisClient *c) {
int j;
for (j = 1; j < c->argc; j++)
pubsubSubscribeChannel(c,c->argv[j]);
}
这个for循环的作用就是一个客户端有可能会订阅好几个频道,而argc就是频道的个数。从上述代码可以看出真正首先订阅的功能是pubsubSubscribeChannel:
int pubsubSubscrib