最近的一個項目須要用到發佈/訂閱的信息系統,以作到最新實時消息的通知。經查找後發現了redis pub/sub(發佈/訂閱的信息系統)能夠知足個人開發需求,並且學習成本和使用成本也比較低。php
你們在看個人blog的同時能夠打開redis官方對於redis pub/sub的介紹,感受看英文文檔吃力的話 :cry: ,能夠看redis中文網的翻譯介紹.nginx
下面我將配着實圖(用個人本地機器環境)來爲你們講解redis的pub/sub怎麼去使用 .git
沒有安裝phpredis擴展的或者沒有redis服務的,請參考個人 另外一篇blog ,有詳細的安裝介紹,這裏再也不贅述了。github
新開一個終端,啓動redis客戶端,並作爲subscribe客戶端(消息訂閱者),訂閱一個名字叫test的頻道信息:redis
發佈一個名字叫test的頻道,信息是:hello,world服務器
再切換到2步驟中的redis客戶端窗口,會發現,已經訂閱到了剛纔發佈的 'hello,world'消息:app
其中,test爲頻道名稱,hello,world即爲消息函數
客戶端能夠訂閱全風格的模式以便接收全部來自能匹配到給定模式的頻道的消息。 好比,將接收全部發到 test.name,test.phone,test.address...等等的消息,該這樣寫:學習
PUBSCRIBE test.*
在終端回車後,同時再新的窗口裏分別發佈兩個頻道的消息,名字分別爲:test.name和test.phone,而後切換到訂閱端的窗口裏,結果以下圖所示:spa
由上圖能夠看出,在訂閱了test.*頻道後,一共收到了 test.name和test.phone兩個頻道的消息,這就是模式匹配訂閱。
那麼取消訂閱匹配該模式的客戶端也比較簡單:
PUNSUBSCRIBE test.*
好,以上的這些簡單的demo,就是關於redis pub/sub(Publish/Subscribe,發佈/訂閱的信息系統)的最基本使用。說了這麼多,跟php也沒有掛上什麼鉤,彆着急,重要的都每每最後出場。
redis的客戶端鏈接支持多種語言。這裏我用的是php的phpredis,它是用c語言編寫的,目前已經做爲php的一個模塊擴展,沒有安裝的能夠參考個人 另外一篇blog ,已經安裝的能夠忽略此步驟.
詳細請看github 這裏 。 這裏我列出一些經常使用的:
Redis::__construct構造函數
$redis = new Redis(); connect, open 連接redis服務 參數 host: string,服務地址 port: int,端口號 timeout: float,連接時長 (可選, 默認爲 0 ,不限連接時間) 注: 在redis.conf中也有時間,默認爲300 pconnect, popen 不會主動關閉的連接 參考上面 setOption 設置redis模式 getOption 查看redis設置的模式 ping 查看鏈接狀態 get 獲得某個key的值(string值) 若是該key不存在,return false set 寫入key 和 value(string值) 若是寫入成功,return ture setex 帶生存時間的寫入值 $redis->setex('key', 3600, 'value'); // sets key → value, with 1h TTL. setnx 判斷是否重複的,寫入值 $redis->setnx('key', 'value'); $redis->setnx('key', 'value'); delete 刪除指定key的值 返回已經刪除key的個數(長整數) $redis->delete('key1', 'key2'); $redis->delete(array('key3', 'key4', 'key5'));
更詳細的使用請參考這裏 ,我就不寫太多,由於我要直接摞代碼了.
/** * redis sub(消息訂閱端) * @ blog: phping.sinaapp.com * @date 2016-04-24 15:00 */ $redis = new Redis(); // 第一個參數爲redis服務器的ip,第二個爲端口 $res = $redis->connect('127.0.0.1', 6379); // test爲發佈的頻道名稱,hello,world爲發佈的消息 $res = $redis->publish('test','hello,world');
/** * redis sub(消息訂閱端) * @ blog: phping.sinaapp.com * @date 2016-04-24 15:00 */ $redis = new Redis(); $res = $redis->pconnect('127.0.0.1', 6379,0); $redis->subscribe(array('test'), 'callback'); // 回調函數,這裏寫處理邏輯 function callback($instance, $channelName, $message) { echo $channelName, "==>", $message,PHP_EOL; }
前面已經提到過,消息訂閱者,即subscribe客戶端,須要獨佔連接,即進行subscribe期間,redis-client沒法穿插其餘操做,此時client以阻塞的方式等待「publish端」的消息,因此咱們用命令行來執行:
則 訂閱消息的redis客戶端已經啓動,隨時等待發布過來的消息並訂閱該消息. 發佈redis消息 一樣,命令行執行消息發佈端的腳本便可:
php pub.php
發現終端有輸出,以下圖
哈哈,是否是 收到了發佈端發佈的'hello,world'這條消息呢。