使用Redis做過非同步佇列嗎,是如何實現的?

2021-09-12 11:31:24 字數 501 閱讀 8018

redis設計用來做快取的,但是由於它自身的某種特性使得它可以用來做訊息佇列。

它有幾個阻塞式的api可以使用,正是這些阻塞式的api讓其有能力做訊息佇列;

另外,做訊息佇列的其他特性例如fifo(先入先出)也很容易實現,只需要乙個list物件從頭取資料,從尾部塞資料即可;

redis能做訊息佇列還得益於其list物件blpop brpop介面以及pub/sub(發布/訂閱)的某些介面,它們都是阻塞版的,所以可以用來做訊息佇列。(list : lpush / rpop)

方式一:生產者消費者模式

使用list結構作為佇列,rpush生產訊息,lpop消費訊息,當lpop沒有訊息的時候,要適當sleep一會再重試。

或者,不用sleep,直接用blpop指令,在沒有訊息的時候,它會阻塞住直到訊息到來。

方式二:發布訂閱者模式

使用pub/sub主題訂閱者模式,可以實現1:n的訊息佇列。

缺點:在消費者下線的情況下,生產的訊息會丟失。此場景,建議用mq。

Redis實現非同步佇列

可以考慮利用list結構進棧出棧實現,那麼基本上你會需要以下步驟 description configonlinemodel author elegant date 2019 11 29 data public class configonlinemodel implements serializa...

使用過Redis做非同步佇列麼,你是怎麼用的?

一般使用list結構作為佇列,rpush生產訊息,lpop消費訊息。當lpop沒有訊息的時候,要適當sleep一會再重試。如果對方追問可不可以不用sleep呢?list還有個指令叫blpop,在沒有訊息的時候,它會阻塞住直到訊息到來。如果對方追問能不能生產一次消費多次呢?使用pub sub主題訂閱者...

使用過 Redis 做非同步佇列麼,你是怎麼用的?

一般使用 list 結構作為佇列,rpush 生產訊息,lpop 消費訊息。當 lpop 沒有 訊息的時候,要適當 sleep 一會再重試。如果對方追問可不可以不用 sleep 呢?list 還有個指令叫 blpop,在沒有訊息的時候,它會阻塞住直到訊息到來。如果對 方追問能不能生產一次消費多次呢?...