Redis學習與實戰之列表

列表是一種能夠記錄重複字符串值、有序排列的數據存儲結構。主要適用於無需次序調整的業務數據記錄和讀取的場景。如記錄用戶在網頁瀏覽過程當中的網頁信息、記錄商品評論信息、記錄任務隊列等。php

1.基本列表操做命令

命令名稱 功能描述 執行時間複雜度
LPush 從列表左邊插入一個或多個元素值 O(1)
LRange 獲取指定範圍內列表的元素值 O(S+N)
RPush 從列表右邊插入一個或多個元素值 O(1)
LPop 從列表左邊讀出並移除一個元素值 O(1)
RPop 從列表右邊讀出並移除一個元素值 O(N)
LRem 從列表中刪除指定元素 O(N)
LIndex 經過指定列表下標,獲取一個元素值 O(1)
LLen 獲取指定列表的元素個數 O(1)
LSet 設置列表指定位置的元素值 O(N)
LTrim 對指定列表範圍的元素進行修改 O(N)

①LPush命令
語法:LPush key value [value …]
參數說明:key是指定的列表名;value是要插入列表左邊的元素,一個能夠插入多個。若是key不存在,則在插入以前會先建立一個空列表。
返回值:返回插入操做後的列表的長度。若是key對應的不是列表,則返回錯誤信息。
例:ruby

>LPush newlist  "one"    //先建立一個空列表,再從左邊插入第一個元素"one"
>(integer) 1
>LPush newlist "two" "three"
>(integer) 3

②LRange命令
語法:LRange key start stop
參數說明:key是指定的列表名;start是列表元素的讀取開始位置;end是列表元素的讀取結束位置。若是stop大於列表範圍時,默認爲列表最大下標的那個元素位置。列表的第一個元素下標是0,以此類推。容許以負數形式倒着對列表下表進行標註。例如start=-1,表示從最後一個元素開始。
返回值:返回指定範圍內的元素值。若是start大於列表範圍,則返回空列表。
例:服務器

>LRange newlist 0 -1   //0表示列表的第一個元素位置,-1表示列表最後一個元素位置
1)"three"
2)"two"
3)"one"
>LRange newlist -1 -2  //獲取列表右邊第一個、第二個元素值
1)"one"
2)"two"
>LRange newlist 0 0  //獲取列表左邊第一個元素值
1)"three"
>LRange newlist 3 5    //開始值大於newlist最大範圍
(empty list or set)      //返回空列表提示

③RPush命令
語法:RPush key value [value …]
參數說明:key指定的列表名;value是須要從右邊插入的值,能夠插入多個。若是key不存在,則先建立空列表,而後再從列表右邊插入。
返回值:返回插入列表後的列表長度。若是key對應的不是列表,則返回錯誤信息。
例:app

>RPush newrank 1 2 3   
>(integer) 3
>LRange 0 -1
1)"1"
2)"2"
3)"3"

④LPop命令
語法:LPop key
參數說明:key是列表名
返回值:返回列表左邊第一個元素值,並從列表中移除該元素值;當key不存在時,返回nil
例:ui

>LPOP newrank
"1"
>LPOP newrank 0 -1
1)"2"
2)"3"
>LRange newrank 0 -1
(empty list or set)

⑤RPop命令
語法:RPop key
返回值:返回列表右邊第一個元素值,並從列表中移除該元素值;當key不存在時,返回nil
例:spa

>RPUSH test a b c
(integer)3
>RPOP test
"c"
>LRange test 0 -1
1)"a"
2)"b"

⑥LRem命令
語法:LRem key count value
參數說明:count爲指定列表元素的下表位置,能夠用正數,從左往右從0開始數下標;能夠爲負數,從右往左從-1開始數下標。value是須要刪除的值。
- count>0 從頭往尾刪除值爲value的元素;
- count<0 從尾往頭刪除值爲value的元素;
- count=0 刪除全部值爲value的元素
返回值:返回被刪除元素的個數;當key不存在,返回0
例:code

>RPush testlist1 q q b c a
(integer)5
>LRem testlist1 1 "q"
(integer) 2
>LRange testlist1 0 -1
1)"b"
2)"c"
3)"a"
>RPush testlist2 q q b c a
(integer)5
>LRem testlist2 -1 "a"
(integer)1
>LRange testlist2 0 -1
1)"q"
2)"q"
3)"b"
4)"c"

⑦LIndex命令
語法:LIndex key index
參數說明:index爲列表指定的下標,能夠從開始,也能夠從-1開始
返回值:返回Index下標對應的列表元素值。當index超出列表範圍時,返回nil
例:server

>RPush indextest q w e r
(integer)4
>LIndex indextest 0
"q"
>LIndex indetest -1
"r"
>LIndex indetest 1
"w"
>LIndex indextest 4
(nil)

⑧LLen命令
語法:LLen key
返回值:返回指定列表的長度(元素個數)。當key不存在時,返回0
例:three

>RPush name "Lee"
(integer)1
>LLen name
(integer)1

⑨LSet命令
語法:LSet key index value
參數說明:key是指定的列表名;index是下標;value是須要設置的值。
返回值:設置成功,返回OK;index超出範圍時,返回錯誤信息。
例:隊列

>RPush age 23 25 27
(integer)3
>LSet age -1 28
OK
>LRange 0 -1
1)"23"
2)"25"
3)"28"

⑩LTrim命令
語法:LTrim key start stop
參數說明:start是列表指定的開始位置下標;stop是列表指定的結束位置下標。改該命令會保留start和stop範圍內列表的元素,而移除其餘元素。若是start超過列表尾部或者start>stop,修剪的列表爲空列表。stop超過列表尾部時,看成列表的最後一個元素的位置看待。
返回值:修剪成功返回OK。
例:

>RPush trimtest a q w x z
(integer)5
>LTrim trimtest 1 3
OK
>LRange 0 -1
1)"q"
2)"w"
3)"x"

2.其餘列表操做命令

命令名稱 功能描述 執行時間複雜度
LInsert 在指定位置插入一個新元素 O(N)
LPushX 只有在列表存在時,從左邊插入一個元素 O(1)
RPopLPush 刪除右邊第一個元素,並將其追加到另外一個列表頭部 O(1)
RPushX 只有在列表存在時,從右邊插入一個新元素 O(1)
BLPop 帶阻塞功能的LPop命令 O(1)
BRPop 帶阻塞功能的RPop命令 O(1)
BRPopLPush 帶阻塞功能的RPopLPush命令 O(1)

①LInsert命令
語法:LInsert key before|after pivot value
參數說明:before|after二選一,before是在指定元素前面插入value,after是在指定元素後面插入value,pivot是列表裏存在的指定的一個元素。key不存在時,該命令不執行任何操做。
返回值:插入成功,返回操做後的列表長度。若是pivot不存在,返回-1;key不存在,則返回錯誤信息。
例:

>RPush testinsert "one" "go" "two"
(integer)3
>LInsert testinsert before one zero
(integer)4
>LRange testinsert 0 -1
1)"zero"
2)"one"
3)"go"
4)"two"

②LPushX命令
語法:LPushX key value
參數說明:key是指定的列表名;value是須要插入列表左邊的值;key不存在時,不執行。這是和LPush命令惟一的區別。
返回值:執行成功,返回操做後列表的長度。key不存在,則返回0
例:

>LPushX testPushX 12  //testPushX 以前是不存在的
(integer)0
>LPush testPushX  12integer)1
>LPushX testPushX 13
(integer)2
>LRange testPushX 0 -1
1)"13"
2)"12"

③RPopLPush命令
語法:RPopLPush source destination
參數說明:source destination都是是列表名。該命令是從source列表獲取並刪除左邊最後一個元素,把獲取的元素插入destination列表左邊第一個位置。
返回值:返回移動的那個元素。若是source列表不存在,返回nil,並且不會執行操做。
例:

>LPush test1 12 13 14
(integer)2
>RPopLPush test1 dest 
"12"
>LRange test1 0 -1
1)"14"
2)"13"
>LRange dest 0 -1
1)"12"

使用場景說明:(1)可使用RPopLPush命令,實現對消息隊列的輪詢。(2)在source和destination列表存儲相同內容的狀況下,經過該命令能夠實現客戶端一個接一個的訪問,而不用像LRange須要把列表中全部元素都傳遞到客戶端,再進行值獲取操做。
④RPushX命令
語法:RPushX key value
參數說明:value是要從右邊插入的值。
返回值:返回執行命令後列表的長度。
例:

>RPushX newR 1 2 3   //newR列表以前不存在
(integer)0
>LRange newR 0 -1
(empty list or set)

⑤BLPop命令
語法:BLPop key[key …] timeout
參數說明:key是指定的列表名,能夠是多個,。timeout是指定阻塞的最大秒數(整型值);當timeout爲0,表示阻塞時間無限制。
阻塞模式:當BLPop指定的列表沒有元素時,則客戶端進入阻塞模式,一直到有新的元素值經過LPush或RPush被插入列表時,阻塞解除,而後成對讀取列表名和左邊第一個元素到客戶端,並把該元素從列表中移除。
返回值:當讀取列表沒有值時,返回nil,而且timeout過時;反之則返回成對的值(列表名和該列表左邊第一個元素值)。
例:

>del t1 t2  //確保t1 t2列表爲空
(integer)0
>RPush t1 a b c
(integer)3
>BLPop t1 t2   1   //1是過時時間
1)」t1" 2)"a" >LRange t1 0 -1 1)"b" 2)"c"

說明:(1)利用NLPop讀取列表元素到客戶端時,當客戶端發生故障,該元素將丟失。(2)BLPop配合Push類命令,能夠實現相似即時聊天消息傳遞的效果。當服務器端列表插入新值時,BLPop具備客戶端自動獲取最新消息數據的能力。

⑥BRPop命令
語法:BRPop key [key …] timeout
參數說明:使用方法和BLpop命令同樣
返回值:返回值和BLPop命令,惟一區別是返回的元素是列表右邊的最後一個。
⑦BRPopLPush命令
語法:BRPopLPush source destination timeout
參數說明:source和destination使用同RPopLPush命令同樣。timeout使用方法和BLPop同樣。
返回值:移動的元素值。timeout超時,則返回多批量的nil。

說明:(1)BRPopLPush在把讀取的值返回給客戶端的同時,會把該值插入destination指定的列表,因此不受客戶端操做影響,而產生元素丟失的問題。

相關文章
相關標籤/搜索