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

2021-08-01 14:53:30 字數 2904 閱讀 9866

常用命令:

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還能同時阻塞多個佇列比如這樣

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

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

3)redis的佇列也可以像

rabbitmq

那樣  即可以做訊息的持久化,也可以不做訊息的持久化。

當做持久話的時候,需要啟動redis

的dump

資料的功能

.暫時不建議開啟持久化。

redis其實只適合作為快取,而不是資料庫或是儲存。它的持久化方式適用於救救急啥的,不太適合當作乙個普通功能來用。應為

dump

時候,會影響效能,資料量小的時候還看不出來,當資料量達到百萬級別,記憶體

10g左右的時候,非常影響效能。

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

5)redis的佇列應用場景是一對多或者一對一的關係,即有多個入隊端,但是只有乙個消費端(出隊

學習筆記 資料結構(三) 佇列和棧

用python實現棧 棧的儲存順序是先入後出。class stack object def init self self.stack def push self,value 進棧 def pop self 出棧 if self.stack self.stack.pop else raise look...

ACE篇之七 ACE容器之三(佇列)

1 前言 ace提供的佇列ace unbounded queue支援從頭部和尾部插入元素,但元素只能從頭部取出。這和c 提供的佇列不同,c 提供的佇列只允許在序列的尾部插入元素。佇列的元素可以在堆上建立,也可以在棧上建立。2 以下 測試的是在棧上建立元素。因此在方法返回時候,它們均會被釋放。prag...

ACE篇之七 ACE容器之三(佇列)

1 前言 ace提供的佇列ace unbounded queue支援從頭部和尾部插入元素,但元素只能從頭部取出。這和c 提供的佇列不同,c 提供的佇列只允許在序列的尾部插入元素。佇列的元素可以在堆上建立,也可以在棧上建立。2 以下 測試的是在棧上建立元素。因此在方法返回時候,它們均會被釋放。prag...