經常使用命令:php
Blpop刪除,並得到該列表中的第一元素,或阻塞,直到有一個可用python
Brpop刪除,並得到該列表中的最後一個元素,或阻塞,直到有一個可用redis
Brpoplpush數據庫
Lindex獲取一個元素,經過其索引列表api
Linsert在列表中的另外一個元素以前或以後插入一個元素緩存
Llen得到隊列(List)的長度數據結構
Lpop從隊列的左邊出隊一個元素性能
Lpush從隊列的左邊入隊一個或多個元素spa
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內部的不少實現,包括髮送緩衝隊列等也都是用的這個數據結構。
lpop彈出列表首元素(即最後入隊的元素)
Rpop彈出列表尾元素 (即入隊的最開始的一個元素)
注意:若是要看成隊列功能,應該是用這個出隊
這裏的出隊都是非阻塞模式,就是你用pop出隊的時候,若是隊列是空的話,你獲得的是一個NULL的值
假如如今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的隊列應用場景是一對多或者一對一的關係,即有多個入隊端,可是隻有一個消費端(出隊)