用redis實現支援優先順序的訊息佇列

2021-08-09 21:41:04 字數 1287 閱讀 2352

用redis實現支援優先順序的訊息佇列

系統中引入訊息佇列機制是對系統乙個非常大的改善。例如乙個

web系統中,使用者做了某項操作後需要傳送郵件通知到使用者郵箱中。你可以使用同步方式讓使用者等待郵件傳送完成後反饋給使用者,但是這樣可能會因為網路的不確定性造成使用者長時間的等待從而影響使用者體驗。 30

分鐘。這種場景的設計不可能同步等待後在回饋,必須是先反饋使用者隨後非同步處理完成,再等待處理完成後根據情況再此反饋使用者與否。

另外適用訊息佇列的情況是那些系統處理能力有限的情況下,先使用佇列機制把任務暫時存放起來,系統再乙個個輪流處理掉排隊的任務。這樣在系統吞吐量不足的情況下也能穩定的處理掉高併發的任務。

訊息佇列

可以用來做排隊機制,只要系統需要用到排隊機制的地方就可以使用訊息佇列來作。首先

redis

它的設計是用來做快取的,但是由於它自身的某種特性使得他可以用來做訊息佇列。它有幾個阻塞式的

api可以使用,正是這些阻塞式的

api讓他有做訊息佇列的能力。

試想一下在

」資料庫解決所有問題

「的思路下,不使用訊息佇列也是可以完成你的需求的。我們把任務全部存放在資料庫然後通過不斷的輪詢方式來取任務處理。這種做法雖然可以完成你的任務但是做法很粗劣。但是如果你的資料庫介面提供乙個阻塞的方法那麼就可以避免輪詢操作了,你的資料庫也可以用來做訊息佇列,只不過目前的資料庫還沒有這樣的介面。

另外做訊息佇列的其他特性例如

fifo

也很容易實現,只需要乙個

list

物件從頭取資料,從尾部塞資料即可實現。

redis

能做訊息佇列得益於他

list

物件blpop brpop

介面以及

pub/sub(發布/

訂閱)的某些介面。他們都是阻塞版的,所以可以用來做訊息佇列。

redis

訊息佇列優先順序的實現

一些基礎

redis

基礎知識的說明

redis> blpop tasklist 0"im task 01"

這個例子使用

blpop

命令會阻塞方式地從

tasklist

列表中取頭乙個資料,最後乙個引數就是等待超時的時間。如果設定為

0則表示無限等待。另外

redis

存放的資料都只能是

string

型別,所以在任務傳遞的時候只能是傳遞字串。我們只需要簡單的將負責資料序列化成

json

格式的字串,然後消費者那邊再轉換一下即可。

用redis實現有優先順序的 celery

新部落格對應文章 需求背景 對於非同步任務處理,相信很多人首選celery,的確,celery處理非同步任務非常強悍,使用簡單,支援各種併發。但是,大家來看看我所遇到的乙個應用場景 每次後台上傳乙個遊戲母包,然後對這個母包處理 新增某種標識,比如id 生成多個遊戲子包,其中有一些id號的包是要求盡快...

Redis實現優先順序佇列

title redis實現優先順序佇列 tags 基於目前系統中存在部分非同步需求,比如匯入或者新開客戶車輛匹配vin碼等 redis中使用列表作為佇列 最關鍵提供了阻塞版本的指令blpop 新建三個佇列對應高中低優先順序 比如f6car high f6car mid f6 car low 再新建d...

使用Redis實現優先順序佇列

優先順序佇列是一種如先進先出佇列和堆疊資料結構的抽象資料型別。所不同的是每乙個元素關聯乙個 優先順序 優先順序高的元素比優先順序低的元素優先得到處理。本文講解如何基於redis的sorted set資料型別實現優先順序佇列。sorted set中元素關聯乙個score,可以按score有序查詢元素。...