RedisPubSub - downgoon/hello-world GitHub Wiki

Redis Pub&Sub

实验目的

验证Redis Pub/Sub是一个完全“即发即失”的Pub/Sub,它具备的特点:

服务器端不做任何存储:一个消息到达后,立马转发给它的Sub。它的Sub必须在线,不在线的收不到消息,而且转发完成后服务器才会给Publisher方返回。

Redis的Pub/Sub实现非常简单,服务器只维护一个订阅关系数据结构,该结构就是一个字典:channel -> SubscribeRedisClient LIST

实验设计

  1. 启动redis-server
  2. 启动redis-cli,运行3个实例作为Subscriber,分别执行命令:subscribe newuser; subscribe newusersubscribe deluser
  3. 启动redis-cli,运行1个实例,作为Publisher,执行命令:publish newuser liwei; publish newuser wangwei; publish deluser wangyi; publish notopic value
  4. 启动redis-cli,运行1个实例,作为管理台,执行命令:pubsub channelspubsub numsub newuser deluser

实验环境准备

安装

$ wget http://download.redis.io/releases/redis-3.0.5.tar.gz
$ tar xzf redis-3.0.5.tar.gz
$ cd redis-3.0.5
$ make

操作

  • 启动服务器
➜  src  ./redis-server
  • 启动3个客户端

第1个客户端:

➜  src  ./redis-cli
127.0.0.1:6379> subscribe newuser
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "newuser"
3) (integer) 1

1) "message"
2) "newuser"
3) "liwei"

第2个客户端:

127.0.0.1:6379> subscribe newuser
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "newuser"
3) (integer) 1
1) "message"
2) "newuser"
3) "liwei"

第3个客户端:

127.0.0.1:6379> subscribe deluser
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "deluser"
3) (integer) 1
  • 管理统计
127.0.0.1:6379> PUBSUB NUMSUB newuser
1) "newuser"
2) (integer) 2
127.0.0.1:6379> PUBSUB NUMSUB deluser
1) "deluser"
2) (integer) 1
127.0.0.1:6379> PUBSUB CHANNELS
1) "deluser"
2) "newuser"
127.0.0.1:6379> PUBSUB CHANNELS
1) "newuser"

订阅多个

消息分三个历史阶段:

  1. Direct: Pub -> Sub
  2. Topic: Pub -> Topic -> Sub
  3. Routing: Pub -> Exchange <-Routing-> Queue -> Sub

Redis实现时,支持模式2和变种3,它术语上叫ChannelPattern。其中Channel就是一个字符串,而Pattern可以支持通配符。

Redis有六个命令:

  1. Subscribe channel [channel …] 订阅通道
  2. Unsubscribe channel [channel …] 取消订阅通道
  3. Psubscribe pattern [pattern …] 模式订阅
  4. Punsubscribe pattern [pattern …] 模式取消订阅
  5. Publish channel message 向通道发送消息,每次只能Pub到一个Channel,但一个Channel可以被多个订阅。
  6. Pubsub subcommand [argument [argument …]] Pub/Sub管理功能
⚠️ **GitHub.com Fallback** ⚠️