列表是一種可以記錄重復字符串值、有序排列的數據存儲結構。主要適用于無需次序調整的業務數據記錄和讀取的場景。如記錄用戶在網頁瀏覽過程中的網頁信息、記錄商品評論信息、記錄任務隊列等。
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對應的不是列表,則返回錯誤信息。
例:
>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對應的不是列表,則返回錯誤信息。
例:
>RPush newrank 1 2 3
>(integer) 3
>LRange 0 -1
1)"1"
2)"2"
3)"3"
④LPop命令
語法:LPop key
參數說明:key是列表名
返回值:返回列表左邊第一個元素值,并從列表中移除該元素值;當key不存在時,返回nil
例:
>LPOP newrank
"1"
>LPOP newrank 0 -1
1)"2"
2)"3"
>LRange newrank 0 -1
(empty list or set)
⑤RPop命令
語法:RPop key
返回值:返回列表右邊第一個元素值,并從列表中移除該元素值;當key不存在時,返回nil
例:
>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
例:
>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
例:
>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
例:
>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 12
(integer)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指定的列表,所以不受客戶端操作影響,而產生元素丟失的問題。