《redis in action》Redis做隊列寫點筆記關注共 1005字,需瀏覽 3分鐘 ·2021-05-02 15:58 使用redis做任何事情都是基于redis提供的數據結構,那么消息隊列有哪幾種類型?之前rabbitmq咋說有簡單的隊列、優(yōu)先級隊列、延遲隊列等等。但是那時候咋也沒說棧這東西。那么redis如何做這些事,根據之前的學習??隙ㄊ褂胠ist了。Redis隊列(先進先出)隊列中我們說redis提供了很多操作隊列的方法??梢詮淖筮吿砑印⒂疫吿砑?、左邊獲取、右邊獲取等等等。所以說有了這些方法,用redis做個簡單的隊列簡直是太容易了。比如我們要做一個先進先出的隊列。那么我們就使用命令RPUSH進行添加,而獲取的時候我們就采用命令LPOP,但是list中可能沒有數據,這時候使用LPOP就會返回nil,所以我們可以采用BLPOP命令進行阻塞式的數據獲取。Redis棧(先進后出)通過上邊的說法,咋操作List的時候直接單向操作,那么就是一個棧啊。LPUSH,BLOPO命令即可搞定。Redis優(yōu)先級隊列(按優(yōu)先級高低進行排序)我們的任務發(fā)送到redis中,然后任務要具有一定的順序,這個順序是優(yōu)先級??紤]到之前l(fā)ist中有l(wèi)push,rpush等命令,所以對于簡單的優(yōu)先級隊列,我們直接采用這兩個命令即可。當然現實的問題是我們的優(yōu)先級消息可能不是確定的,所以兼容性問題很重要。故此我們可以根據建立多個優(yōu)先級list,然后我們在獲取消息的時候用多個優(yōu)先級list去獲取。比如brpop list1 list2,其中l(wèi)ist1是優(yōu)先級高的隊列。List2是優(yōu)先級低的隊列。但是這種方式實現優(yōu)先級隊列的問題是擴展性不強。那么最后就是采用ZSET來做了,但是ZSET的容量是8192,所以容量是個大問題,除此之外,zset需要去反查一下真實的消息,所以效率比較低。但是如果做異步處理的話,也還行。Riedis做延遲隊列(指定時間執(zhí)行)Redis做延遲隊列其實還是用zset去做,我們用當前的時間+需要延遲的時間作為zset的score,然后我們按照score的增序來獲取對應的元素,通過判斷時間是否小于當前時間然后執(zhí)行相關的動作,處理完畢之后將其從ZSET和list中移除即可。 瀏覽 31點贊 評論 收藏 分享 手機掃一掃分享分享 舉報 評論圖片表情視頻評價全部評論推薦 Redis in ActionRedis in Action0Redis in ActionRedis is an innovative data tool that offers more 《redis in action》redis事務寫點筆記0《redis in action》redis復制寫點筆記0《redis in action》redis發(fā)布訂閱寫點筆記0《redis in action》Redis分布式鎖寫點筆記0《redis in action》Redis aof持久化寫點筆記0《redis in action》redis持久化簡介寫點筆記0《redis in action》Redis災備處理寫點筆記0《redis in action》redis事務和管道寫點筆記0點贊 評論 收藏 分享 手機掃一掃分享分享 舉報