推模式
客户端使用SUBSCRIBE命令订阅一个channel(会被阻塞),其他的客户端可以使用PUBLISH命令向这个channel发送消息,所有订阅者都会收到这个消息。
推模式每一个channel维护一个客户端列表,发送消息的时候遍历列表发送。其余订阅,取消订阅,模式匹配订阅等实现也都很简单
例子:
subscriber:
subscribe test
publisher:
publish test "hello world"
subscriber:
1) "message"
2) "test"
3) "hello world"
拉模式
推模式要求订阅者都阻塞在channel上,当有消息发送到channel上后,所有订阅者都收到消息。另外,如果客户端断掉连接则自动退出订阅,断开的连接可能造成消息丢失。
与之对应拉模式。发送者将消息放到一个邮箱中,所有订阅的这个邮箱的客户端可以在任意时刻去收取。保证所有客户端都收取完成的邮件才删除。
拉模式不需要客户端阻塞。
拉模式需要3种数据结构,邮箱,订阅者,订阅管理员,都是有序列表。还有一个自增计数器。
- 邮箱的KEY是邮箱名字,有序列表保存消息,序是消息ID。
- 订阅者的KEY是订阅者名字,有序列表保存订阅者订阅的邮箱,序是这个订阅者在该邮箱读到的消息ID。
- 每一个邮箱有一个订阅管理员,KEY是和邮箱名字