Redis高級功能之分管道技術、消息隊列
一、管道技術
我們先來試試管道技術,Redis 管道技術可以在服務端未響應時,客戶端可以繼續向服務端發送請求,并最終一次性讀取所有服務端的響應,說白了也就是提供請求-響應式協議的TCP服務,所以當客戶端請求發出,服務端處理并返回結果到客戶端,一般是以阻塞形式等待服務端的響應,但這在批量處理連接時延遲問題比較嚴重,所以Redis為了提升或彌補這個問題,引入了管道技術:可以做到服務端未及時響應的時候,客戶端也可以繼續發送命令請求,做到客戶端和服務端互不干涉影響,服務端并最終返回所有服務端的響應。
在構建批量命令集或是組裝屬性字符串時,命令間使用\r\n進行分離,測試是否可用以下命令
$(echo -en "PING\r\n SET runoobkey redis\r\nGET runoobkey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379
在php中的實例如下:
這樣來我們就可以使用多個命令,并最終一次返回數據,大大的提示了性能;
二、消息隊列
在Redis中消息隊列有一種為發布訂閱(pub/sub),是一種消息通信模式:subscribe訂閱一個頻道,publish可以像頻道廣播消息。
pub/sub 模式固然很好用,但是同樣有一個問題,就是如果有多個人訂閱了同一頻道,而這個頻道的數據只能被一個接收方處理,不能夠重復處理,這時該怎么辦?
解決方法有2種:
1. publish? 將數據寫入到一個list or sorted list 隊列,寫完成后開始給終端廣播消息,告訴大家,有新的數據等待處理,這個時候,誰能pop到數據,就是誰處理,這個操作是原子性的,也就是說不會被重復處理。
2. 使用阻塞模式,redis提供了blpop brpop這種操作,也就是一直阻塞一個隊列,直到有數據來。 這種模式保證了數據的原子性,而且使應用程序可以支持分布式多臺機器部署。
上代碼,下圖是sub(訂閱者)實現方式:
打開redis命令行,輸入以下命令:publish roban:test:channel hello
發布這條信息后,sub就會roban:test:channel hello這個通知了。
這次學習就先分享這么多了,下次再來吧。