科技

使用Redis作為訊息佇列實現生產消費與釋出訂閱

日常的工作中,經常會用到佇列(Queue),在python中有原生的佇列,但是由於原生的佇列是存在於記憶體當中,當系統重啟後佇列裡的訊息就沒有,且無法進行分步式,Redis中的List資料有四種原語,LPUSH,LPOP,RPUSH,RPOP,配合使用可以實現簡單的生產消費模型。

原語說明

push 是向列表中新增資訊,pop是從列表中讀取資訊,l與r 則是左和右或者說列表頭和列表尾,lpush將訊息放到列表頭,rpush將訊息放到列表尾。

可以看出每次呼叫lpush時,資料都新增到列表的最前面.

lpop是從列表的頭開始出資料,現在task中有三條資料,['task10','task2','task1'],現在呼叫三次lpop

可以看到lpop是從列表頭中開始彈出資料的,當列表中沒有資料的時候,則返回空。

rpush與rpop與其相反,從列表尾部進行操作

實現生產消費模型

那麼利用列表的push與pop命令就可以實現簡單的生產消費了

阻塞pop

lpop與rpop還有一個阻塞的版本,當給定列表內沒有任何元素可供彈出的時候,連線將被 BLPOP 命令阻塞,直到等待超時或發現可彈出元素為止。有時候,為了等待一個新元素到達資料中,需要使用輪詢的方式對資料進行探查。

另一種更好的方式是,使用系統提供的阻塞原語,在新元素到達時立即進行處理,而新元素還沒到達時,就一直阻塞住,避免輪詢佔用資源。

釋出訂閱

可以配合使用publish 和 pubsub 來實現釋出訂閱

釋出

該方法返回的是訂閱者的數量

訂閱

訂閱者能收到的資訊只能是自它開始訂閱之後的訊息,之前已經發布的就不能收到了。

parse_response() 是阻塞的,只有當收到訊息時才結束,可以寫一個while 迴圈,但還有一個更好的方法,是呼叫它的listen() 方法

redis可以作為簡單的訊息佇列來用,但是它畢竟不是專業的訊息佇列,如果對於有很大的訊息佇列需求的系統還是考慮使用專業的MQ如kafka等。

由於今日頭條上發的文章對於程式碼排版不太方便,所以我將程式碼片段都使用了截圖的方式,想要複製程式碼請點選 "瞭解更多"來檢視原文或者微信搜尋公眾號"序語程言"

Reference:科技日報

看更多!請加入我們的粉絲團

轉載請附文章網址

不可錯過的話題