?這幾天做的工單,涉及到了關于 redis 的發(fā)布訂閱功能,這里就跟大家分享一下。
發(fā)布訂閱(pub/sub)是一種消息通信模式,主要的目的是解耦消息發(fā)布者和消息訂閱者之間的耦合,這點和設計模式中的觀察者模式比較相似。pub /sub不僅僅解決發(fā)布者和訂閱者直接代碼級別耦合也解決兩者在物理部署上的耦合。Redis作為一個pub/sub server,在訂閱者和發(fā)布者之間起到了消息路由的功能。
訂閱者可以通過subscribe和psubscribe命令向redis server訂閱自己感興趣的消息類型,redis將消息類型稱為通道(channel)。當發(fā)布者通過publish命令向redis server發(fā)送特定類型的消息時。訂閱該消息類型的全部client都會收到此消息。這里消息的傳遞是多對多的。一個client可以訂閱多個channel,也可以向多個channel發(fā)送消息。
網(wǎng)上有個測試:
1. 啟動redis-cli:
redis 127.0.0.1:6379> psubscribe news.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1
2. 再啟動一個redis-cli用來發(fā)布兩條消息:
redis 127.0.0.1:6379> publish news.share "share a link http://www.google.com"
(integer) 2
redis 127.0.0.1:6379> publish news.blog "I post a blog"
(integer) 2
3. 另一個redis-cli輸出如下:
1) "pmessage"
2) "news.*"
3) "news.share"
4) "share a link http://www.google.com"
1) "pmessage"
2) "news.*"
3) "news.blog"
4) "I post a blog"
redis client使用psubscribe訂閱了一個使用通配符的通道(*表示任意字符串),此訂閱會收到所有與news.*匹配的通道消息。redis- cli打印到控制臺的訂閱成功消息表示使用psubscribe命令訂閱news.*成功后,連接訂閱通道總數(shù)為1。
當我們在一個client使用publish向news.share和news.blog通道發(fā)出兩個消息后。redis返回的(integer) 2表示有兩個連接收到了此消息。
看完一個小例子后應該對pub/sub功能有了一個感性的認識。需要注意的是當一個連接通過subscribe或者psubscribe訂閱通道后就進入訂閱模式。在這種模式除了再訂閱額外的通道或者用unsubscribe或者punsubscribe命令退出訂閱模式,就不能再發(fā)送其他命令。另外使用psubscribe命令訂閱多個通配符通道,如果一個消息匹配上了多個通道模式的話,會多次收到同一個消息。
redis的pub/sub還是有點太單?。▽崿F(xiàn)才用150行代碼)。在安全,認證,可靠性這方便都沒有太多支持
我之前安裝過Redis和的Redis客戶端工具,測試過,有興趣的小伙伴可以從測試測試