消息通信模式,发送者发送消息,接受者接受消息,微信,微博,关注系统
redis客户端可以订阅任意数量的频道
订阅/发布消息:
- 消息发送者
- 频道
- 消息内容
- 消息接受者
消息发布的原理
订阅/发布消息需要的四个必要对象:
- 消息发送者 publisher
- 频道 - channel
- 消息内容 - channel msg
- 消息接受者 - subscriber
如何订阅频道
使用subscribe 命令发送消息,订阅消息会显示 1)2)3),同时显示订阅的序号,从1开始,这时候命令行会阻塞等待消息传递
1 | 127.0.0.1:16379> subscribe first second |
发送消息
redis设计了 publish 命令,用于订阅频道,发送消息会返回成功收到消息的数量,如果没有收到则为0
我们需要在新开一个窗口,输入如下命令
1 | [xd@iZwz99gyct1a1rh6iblyucZ bin]$ ./redis-cli -p 16379 |
模式匹配
功能说明:允许客户端订阅某个模式的频道
本质:其实就是可以通过使用通配符的模式批量订阅一批频道
具体的命令如下:
1 | 127.0.0.1:16379> PSUBSCRIBE chanel-* |
如果订阅了一批频道,那么发送给这个频道的消息将被客户端接收到两次,只不过这两条消息的类型不同,一个是message类型,一个是pmessage类型,但其内容相同。
1 | 127.0.0.1:16379> PSUBSCRIBE chanel-* |
取消订阅
Redis采用UNSUBSCRIBE和PUNSUBSCRIBE命令取消订阅
redis发布订阅原理实现
https://juejin.im/post/6844904186534952968#heading-7
subscribe的实现
- 维护一个client 和 一个 server 结构体,都存储pubsub_patterns
- client存储的是以hash表来实现的,用键值对的形式,键为键表示订阅的频道,值为空。
- 而server存储的是改服务器当中所有频道以及订阅这个频道的客户端,也是字典类型。插入节点的时候键为频道,值为订阅的所有客户端组成的链表
psubscribe
- 大体实现和subscribe类似,client维护的内容是相似的
- 在server当中,表示该服务端的所有频道以及订阅频道客户端。插入节点使用的是键为频道,值为订阅了所有客户端组成的链表
PUBLISH
会在redis_server当中遍历所有的pubsub_channel中管理的所有频道,找到对应的频道之后链表遍历所有的客户端,将消息发给客户端。
redis发布订阅的应用
用于监听命令和数据的变化,当redis通过发布订阅进行写操作的时候,会有两条消息,一条是del mykey,另一条是mykey del。一个表示空间变化,一个是频道的改变。可以用于进行消息的实时推送。
redis和activeMQ的比较
(1)ActiveMQ支持多种消息协议,包括AMQP,MQTT,Stomp等,并且支持JMS规范,但Redis没有提供对这些协议的支持;
(2)ActiveMQ提供持久化功能,但Redis无法对消息持久化存储,一旦消息被发送,如果没有订阅者接收,那么消息就会丢失;
(3)ActiveMQ提供了消息传输保障,当客户端连接超时或事务回滚等情况发生时,消息会被重新发送给客户端,Redis没有提供消息传输保障。
ActiveMQ所提供的功能远比Redis发布订阅要复杂,毕竟Redis不是专门做发布订阅的,但是如果系统中已经有了Redis,并且需要基本的发布订阅功能,就没有必要再安装ActiveMQ了,因为可能ActiveMQ提供的功能大部分都用不到,而Redis的发布订阅机制就能满足需求。