redis 學習筆記三(隊列功能)

來源:互聯網
上載者:User

標籤:style   blog   http   ar   使用   sp   資料   on   2014   

Redis隊列功能介紹List

常用命令:

Blpop刪除,並獲得該列表中的第一元素,或阻塞,直到有一個可用

Brpop刪除,並獲得該列表中的最後一個元素,或阻塞,直到有一個可用

Brpoplpush

Lindex擷取一個元素,通過其索引列表

Linsert在列表中的另一個元素之前或之後插入一個元素

Llen獲得隊列(List)的長度

Lpop從隊列的左邊出隊一個元素

Lpush從隊列的左邊入隊一個或多個元素

Lpushx當隊列存在時,從隊到左邊入隊一個元素

Lrange從列表中擷取指定返回的元素

Lrem從列表中刪除元素

Lset設定隊列裡面一個元素的值

Ltrim修剪到指定範圍內的清單

Rpop從隊列的右邊出隊一個元素

Rpoplpush刪除列表中的最後一個元素,將其追加到另一個列表

Rpush從隊列的右邊入隊一個元素

Rpushx從隊列的右邊入隊一個元素,僅隊列存在時有效

 

Redis支援php、python、c等介面

 

 

 

 

 

 

 

 

應用情境:

Redis list的應用情境非常多,也是Redis最重要的資料結構之一,比如twitter的關注列表,粉絲列表等都可以用Redis的list結構來實現。

Lists 就是鏈表,相信略有資料結構知識的人都應該能理解其結構。使用Lists結構,我們可以輕鬆地實現最新訊息排行等功能。

Lists的另一個應用就是訊息佇列,

可以利用Lists的PUSH操作,將任務存在Lists中,然後背景工作執行緒再用POP操作將任務取出進行執行。Redis還提供了操作Lists中某一段的api,你可以直接查詢,刪除Lists中某一段的元素。

 

如果需要還可以用redis的Sorted-Sets資料結構來做優先隊列.可以給每條訊息加上一個唯一的序號。這裡就不詳細介紹了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

實現方式:

Redis list的實現為一個雙向鏈表,即可以支援反向尋找和遍曆,更方便操作,不過帶來了部分額外的記憶體開銷,Redis內部的很多實現,包括髮送緩衝隊列等也都是用的這個資料結構。

  

 

 

 

 

 

 

 

 

 

 

 

:1)入隊

 

 

 

 

 

 

 

 

 

 

 

2)出隊(非阻塞模式)

 

 

lpop彈出列表首元素(即最後入隊的元素)

 

 

 

 

 

 

Rpop彈出列表尾元素 (即入隊的最開始的一個元素)

注意:如果要當作隊列功能,應該是用這個出隊

 

 

這裡的出隊都是非阻塞模式,就是你用pop出隊的時候,如果隊列是空的話,你得到的是一個NULL的值

 

 

 

 

 

 

 

 

 

 

 

3)出隊(阻塞模式)

假如現在queue隊列為空白  我們用brpop命令

BRPOP 是一個阻塞的列表彈出原語。 它是 RPOP 的阻塞版本,因為這個命令會在給定list無法彈出任何元素的時候阻塞串連。 該命令會按照給出的 key 順序查看 list,並在找到的第一個非空 list 的尾部彈出一個元素。

 

 

 

 

A)

我們執行brpop命令

可以看到隊列queue沒有元素的時候  是阻塞的  即不傳回值    

其中0是逾時時間 為0表示一直等待

 

B)

這個時候我們用lpush往隊列裡 入隊一個資料“bbb”

 

C)

阻塞的隊列立馬會彈出出隊元素   顯示隊列名字  和 出隊元素  已經等待了多少時間

 

D)

Brpop還能同時阻塞多個隊列比如這樣

 

 

 

 

用redis的list當作隊列可能存在的問題

1)redis崩潰的時候隊列功能失效

2)如果入隊端一直在塞資料,而出隊端沒有消費資料,或者是入隊的頻率大而多,出隊端的消費頻率慢會導致記憶體暴漲

3)Redis的隊列也可以像rabbitmq那樣  即可以做訊息的持久化,也可以不做訊息的持久化。

當做持久話的時候,需要啟動redis的dump資料的功能.暫時不建議開啟持久化。

 

Redis其實只適合作為緩衝,而不是資料庫或是儲存。它的持久化方式適用於救救急啥的,不太適合當作一個普通功能來用。應為dump時候,會影響效能,資料量小的時候還看不出來,當資料量達到百萬層級,記憶體10g左右的時候,非常影響效能。

 

4)假如有多個消費者同時監聽一個隊列,其中一個出隊了一個元素,另一個則擷取不到該元素

5)Redis的隊列應用情境是一對多或者一對一的關係,即有多個入隊端,但是只有一個消費端(出隊)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PHP的redis 簡單操作樣本

 

redis 學習筆記三(隊列功能)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.