Redis實現訊息佇列

2021-10-05 18:26:58 字數 1073 閱讀 7886

佇列本身其實是個有序的列表,而redis是支援list的,可以利用redis的列表(list)來實現簡單佇列。

一般有兩種方式:

1、lpush(頭部插入)和rpop(尾部彈出)

2、rpush(尾部插入)和lpop(頭部彈出)

兩種均可,下面示例使用的是:第一種:lpush和rpop。

一般開發的時候我們會分為生產者和消費者,生產者生產訊息,消費者獲取訊息進行處理。

producer: 

redis->lpush(『joblist』, 『this is job-1』)

; redis->lpush(『joblist』, 『this is job-2』)

; ….

cosumer: 

job = redis->rpop(『joblist』)

;// return job-1

done the job….

job = redis->rpop(『joblist』)

;// return job-2

done the job…

需要注意的是redis實現的訊息佇列功能本身存在一些缺陷,這也是redis本身的限制,乙個重要的缺陷在於沒有類似rabbitmq那樣成熟的ack訊息確認機制(雖然redis也可以通過**層自己封裝寫個ack訊息確認機制,但相對比較繁雜。一般常見的思路是pop時將pop出的資料放到備份的地方,當有ack請求(確認訊息被消耗)後將備份的資訊刪除掉;每次在pop前需要檢查備份佇列中有沒有過期的資料沒有ack的,如果有則push到list中後再從list中pop出來。

一般來說如果對資料沒有極高要求的又不想搭建其他qm元件的話可以直接用redis的list功能實現,如果對資料冪等性、一致性有要求的話建議使用rabbitmq(目前功能最完善的企業級mq產品,雖然吞吐量不是最強的,但足以應付絕大多數公司的流量)或者不想自己搭建的話也可以直接使用第三方的訊息佇列產品,比如阿里雲的訊息佇列,安全效能均有保障。

redis實現訊息佇列

用redis實現乙個訊息通知系統,總結了一下技術細節,其中演示 如果沒有特殊說明,使用的都是phpredis擴充套件來實現的。記憶體 比如要推送一條全域性訊息,如果真的給所有使用者都推送一遍的話,那麼會占用很大的記憶體,實際上不管粘性有多高的產品,活躍使用者同全部使用者比起來,都會小很多,所以如果只...

redis實現訊息佇列

模擬生產者 消費者 生產者 往list資料型別中放入key為product的資料 public static void main string args 消費者 使用堵塞命令實時獲取product的資料 public static void main string args catch except...

redis 實現訊息佇列

redis 實現訊息佇列 測試 component public class timetask object obj null for int i 0 i 10 i 封裝redis工具類 slf4j component public class redisutil catch exception e...