List是Redis的基礎數據類型之一,相似於Java中的LinkedList。一個列表最多包含232個元素,常被用做模擬隊列操做,接下來咱們具體介紹一下List相關的命令。bash
BLPOP
最先可用版本:2.0.0微信
時間複雜度:O(1)app
用法:ui
1BLPOP key [key ...] timeout
BLPOP是LPOP的阻塞版本,當列表沒有元素能夠被彈出時,鏈接將被阻塞。當給定多個key,會按參數key的順序檢查各個列表,彈出第一個非空列表的的頭元素。timeout表示阻塞的最大秒數,timeout爲0表示無限阻塞。spa
這裏有一個問題,當多個元素同時push進一個list時,阻塞的BLPOP命令會有什麼操做。在說明以前,咱們先思考一下如何操做纔會出現這樣的狀況:.net
對list執行LPUSH mylist a b c這樣的命令code
對同一個list進行屢次push操做,這些操做是在事務中執行的orm
使用Redis2.6之後的版本執行Lua腳本進行push操做索引
對於這個問題,Redis2.4版本和Redis2.6之後的版本處理方法有所不一樣。隊列
假如客戶端A執行命令
1BLPOP mylist 0
這時mylist爲空,客戶端A會被阻塞,此時客戶端B執行了命令
1LPUSH mylist a b c
若是在Redis2.6版本以後,客戶端A會返回c,由於在客戶端Bpush了元素a、b、c後,其從左到右的順序是c、b、a,可是在Redis2.4版本中,客戶端會在push操做的上下文,因此當LPUSH開始往list裏push第一個元素時,它就被傳送到客戶端A,也就是客戶端A會接收到a。
有時,咱們會有這樣的需求:咱們須要爲了等待Set的新元素而阻塞隊列,這樣就須要一個阻塞版的SPOP,惋惜目前尚未支持這樣的命令。不過咱們能夠使用BLPOP命令來實現,下面是實現的僞代碼:
消費者:
1LOOP forever
2 WHILE SPOP(key) returns elements
3 ... process elements ...
4 END
5 BRPOP helper_key
6END
生產者:
1MULTI
2SADD key element
3LPUSH helper_key x
4EXEC
BRPOP
最先可用版本:2.0.0
時間複雜度:O(1)
它與BLPOP基本相同,不一樣的地方在於它是從尾部彈出元素,而BLPOP是從頭部彈出元素。
BRPOPLPUSH
最先可用版本:2.2.0
時間複雜度:O(1)
用法:
1BRPOPLPUSH source destination timeout
它是RPOPLPUSH的阻塞版本,當source包含元素時,它與RPOPLPUSH表現的同樣,當source爲空時,Redis會被阻塞,直到另外一個客戶端push元素,或者達到timeout時間限制。
LINDEX
最先可用版本:1.0.0
時間複雜度:O(N),N是找到目標元素所跨越元素的個數,當目標元素爲第一個或者最後一個時,時間複雜度爲O(1)。
該命令用於返回列表中指定位置的元素,index是從0開始的,-1表示倒數第一個元素,-2表示倒數第二個元素,以此類推。當key不是一個list時,會返回一個錯誤。當index超出範圍時返回nil。
LINSERT
最先可用版本:2.2.0
時間複雜度:O(N),N爲在找到基準value前所跨越的元素個數。也就是說,若是插入到頭部,時間複雜度爲O(1),若是插入到尾部,時間複雜度爲O(N)。
用法:
1LINSERT key BEFORE|AFTER pivot value
該命令把value插入到基準值pivot的前面或者後面,若是key不存在,list被當作空列表,不會發生任何操做。若是key存儲的不是list,則會報錯。命令的返回值是,插入操做後,list的長度,若是找不到基準值pivot,則會返回-1。
LLEN
最先可用版本:1.0.0
時間複雜度:O(1)
返回指定key的list的長度,若是key不存在,則被看做是空列表,返回0。若是key存儲的不是list,則會報錯。
LPOP
最先可用版本:1.0.0
時間複雜度:O(1)
該命令用於刪除並返回list的第一個元素。當key不存在時,返回nil。
LPUSH
最先可用版本:1.0.0
時間複雜度:O(1)
將全部指定的value插入列表的頭部,若是key不存在,就先建立一個空列表並進行插入操做,若是key存儲的不是list,則會返回一個錯誤。咱們能夠一次插入多個元素,他們從左到右依次被插入到list中,所以,
1LPUSH mylist a b c
命令生成的列表,c是第一個元素,a是第三個元素。該命令的返回值是插入操做後列表的長度。須要注意的一點是:在Redis2.4版本之前(不包括2.4)是不支持一次插入多個元素的。
LPUSHX
最先可用版本:2.2.0
時間複雜度:O(1)
當key存在時,在頭部插入指定元素,key不存在時,不進行插入操做。
LRANGE
最先可用版本:1.0.0
時間複雜度:O(S+N),S是start元素的偏移量,N是指定範圍元素的個數
用法:
1LRANGE key start stop
返回指定key的指定範圍的元素,start和stop都是下標(從0開始),一樣,下標能夠是負數,-1表示倒數第一個,-2表示倒數第二個。命令返回的結果會包含下標爲stop的元素。若是start超出list的長度返回,則會返回一個空的列表,若是stop超出list的長度返回,則會返回到最後一個元素。
LREM
最先可用版本:1.0.0
時間複雜度:O(1)
用法:
1LREM key count value
移除list中前count次出現的value
count>0時:從頭至尾匹配value
count=0時:移除所有匹配到value的元素
count<0時,從尾部到頭部匹配value
當key不存在時,被當作空列表看待,直接返回0。
LSET
最先可用版本:1.0.0
時間複雜度:O(N),N爲list的長度
設置指定下標的value,若是下標超出範圍,則會返回一個錯誤。
LTRIM
最先可用版本:1.0.0
時間複雜度:O(N),N刪除掉的元素的個數
該命令用來修剪一個已經存在的list,修剪後的list只包含指定範圍的元素。start和stop都是從0開始的索引,例如,
1LTRIM foobar 0 2
就是隻保留foobar的前3個元素。start和stop也能夠是負數,-1表示倒數第一個元素,-2表示倒數第二個,以此類推。若是下標超出範圍,並不會報錯,而是進行以下處理:若是start比list的最後一個元素的下標大,或者start>end,結果就是空list,若是end大於最大下標,Redis會將其當成最後一個元素來處理。
RPOP
最先可用版本:1.0.0
時間複雜度:O(1)
刪除並返回list的最後一個元素。當key不存在時,返回nil。
RPOPLPUSH
最先可用版本:1.2.0
時間複雜度:O(1)
原子性的返回並刪除source的最後一個元素,並把該元素存儲到destination的第一個元素的位置。舉個栗子,source保存了元素a、b、c,destination保存了x、y、z,執行了
1RPOPLPUSH source destination
後,source保存的會是a、b,而destination保存的則是c、x、y、z。該命令的返回值是那個從source被移出和存入destination的元素。
RPUSH
最先可用版本:1.0.0
時間複雜度:O(1)
將指定元素插入到指定key的尾部。若是key不存在,就建立一個空的列表。若是key保存的不是list,則會返回一個錯誤。在2.4版本以後,能夠使用一條命令一次插入多個值,插入的順序是從左到右。
RPUSHX
最先可用版本:2.2.0
時間複雜度:O(1)
它和RPUSH惟一不一樣的一點就是若是key不存在,就不會進行任何操做。
本文分享自微信公衆號 - 代碼潔癖患者(Jackeyzhe2018)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。