Redis常見數(shù)據(jù)類型List列表使用詳解
前言
在 Redis 中,List 是一種非常常見的數(shù)據(jù)類型,用于表示一個有序的字符串集合。與傳統(tǒng)的鏈表結(jié)構(gòu)類似,Redis 的 List 支持在兩端進行高效的插入和刪除操作,因此非常適合實現(xiàn)隊列(Queue)和棧(Stack)等數(shù)據(jù)結(jié)構(gòu)。
Redis List 的基本概念
- 有序的字符串集合:List中的元素按插入順序排列,每個元素都是一個字符串。
- 雙端隊列:Redis List 是一個雙端隊列(Deque),允許你在列表的兩端高效地進行操作(插入和刪除)。
- 最大長度:Redis 的 List 數(shù)據(jù)類型沒有最大長度限制,理論上可以存儲無限多的元素,除非內(nèi)存不足。
List命令:

LPUSH
LPUSH命令用于將一個或多個元素插入到列表的頭部(即左側(cè))。如果列表不存在,Redis 會自動創(chuàng)建一個空列表并執(zhí)行插入操作。語法: LPUSH key value [value ...]
127.0.0.1:6379> lpush key 1 2 3 4 (integer) 4 127.0.0.1:6379> lrange key 0 -1 1) "4" 2) "3" 3) "2" 4) "1"返回值
- 返回插入元素后的列表長度。
LPUSHX
LPUSHX是一個用于將元素推入到列表(list)頭部的命令,但與LPUSH不同的是,LPUSHX只有在列表已存在的情況下才會執(zhí)行操作。如果列表不存在,LPUSHX不會做任何操作,也不會創(chuàng)建新的列表。語法:LPUSHX key value
127.0.0.1:6379> lpush key world (integer) 1 127.0.0.1:6379> lpushx key hello (integer) 2 127.0.0.1:6379> lpushx key2 hi (integer) 0 127.0.0.1:6379> lrange key 0 -1 1) "hello" 2) "world" 127.0.0.1:6379> lrange key2 0 -1 (empty array)總結(jié):
LPUSHX用于將元素添加到已經(jīng)存在的列表中,它不會創(chuàng)建新的列表,這與LPUSH(無論列表是否存在都創(chuàng)建新列表)有所不同。
RPUSH
RPUSH命令用于將一個或多個元素插入到列表的尾部(即右側(cè))。如果列表不存在,Redis 會自動創(chuàng)建一個空列表并執(zhí)行插入操作。語法:RPUSH key value [value ...]
127.0.0.1:6379> rpush key 1 2 3 4 (integer) 4 127.0.0.1:6379> rpush key 5 6 7 8 (integer) 8 127.0.0.1:6379> lrange key 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8"返回值:
- 返回插入元素后的列表長度。
RPUSHX 同理 LPUSHX
LRANGE
LRANGE命令用于獲取列表中的一個指定范圍的元素。你可以指定開始和結(jié)束的索引位置,然后 Redis 會返回該范圍內(nèi)的所有元素。語法:LRANGE key start stop
127.0.0.1:6379> lrange key 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8" 127.0.0.1:6379> lrange key 0 3 1) "1" 2) "2" 3) "3" 4) "4" 127.0.0.1:6379> lrange key 0 100 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8" 127.0.0.1:6379> lrange key 8 10 (empty array) 127.0.0.1:6379> lrange key -8 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8"返回值:
- 返回指定范圍內(nèi)的所有元素。如果范圍超出列表長度,Redis 會返回所有符合范圍條件的元素。
總結(jié):
LRANGE用于獲取 Redis 列表中指定范圍的元素。- 支持負數(shù)索引,可以從列表尾部獲取元素。
- 如果
start和stop超出了列表的實際長度,Redis 會自動調(diào)整范圍。
LPOP
LPOP命令用于從列表的頭部(左側(cè))移除并返回一個元素。執(zhí)行該命令時,列表的第一個元素會被移除,并返回這個被移除的元素。如果列表為空,LPOP會返回nil。語法:LPOP key
127.0.0.1:6379> rpush key 1 2 3 4 (integer) 4 127.0.0.1:6379> lpop key "1" 127.0.0.1:6379> lpop key "2" 127.0.0.1:6379> lpop key "3" 127.0.0.1:6379> lpop key "4" 127.0.0.1:6379> lpop key (nil)返回值:
- 返回被移除的列表元素。
- 如果列表為空,返回
nil。總結(jié):
LPOP是一個用于從 Redis 列表左側(cè)移除并返回一個元素的命令。如果列表為空,返回nil。
RPOP 同理
RPOP 命令用于從列表的尾部(右側(cè))移除并返回一個元素。執(zhí)行該命令時,列表的最后一個元素會被移除,并返回該元素。如果列表為空,RPOP 會返回 nil。
LINDEX
LINDEX命令用于獲取列表中指定位置的元素。你可以通過指定一個索引來獲取列表中對應(yīng)位置的元素。語法:LINDEX key index
127.0.0.1:6379> rpush key 1 2 3 4 5 6 7 8 (integer) 8 127.0.0.1:6379> lindex key 0 "1" 127.0.0.1:6379> lindex key 7 "8" 127.0.0.1:6379> lindex -1 127.0.0.1:6379> lindex key -1 "8" 127.0.0.1:6379> lindex key -7 "2" 127.0.0.1:6379> lindex key 9 (nil)返回值:
返回指定位置的元素。
如果指定的索引超出了列表的范圍,返回
nil。總結(jié):
LINDEX用于獲取 Redis 列表中指定位置的元素??梢酝ㄟ^正數(shù)索引或負數(shù)索引來指定位置。如果索引超出范圍,返回nil。這是一個讀取操作,而不會改變列表內(nèi)容
LINSERT
LINSERT命令用于在列表中指定位置插入一個元素。你可以在列表的 左側(cè) 或 右側(cè) 插入元素,依據(jù)你指定的插入位置。語法:LINSERT key BEFORE|AFTER pivot element127.0.0.1:6379> rpush key a b c d (integer) 4 127.0.0.1:6379> linsert key before b 111 (integer) 5 127.0.0.1:6379> linsert key after b 222 (integer) 6 27.0.0.1:6379> linsert key before e 333 (integer) -1 127.0.0.1:6379> lrange key 0 -1 1) "a" 2) "111" 3) "b" 4) "222" 5) "c" 6) "d"返回值:
如果操作成功,返回列表的新長度。
如果
pivot元素在列表中不存在,則不插入任何元素,返回-1。總結(jié):
LINSERT命令在 Redis 列表中指定位置插入一個新元素??梢栽谥付ㄔ氐?前 或 后 插入。它是一個修改列表的命令,成功執(zhí)行后返回新的列表長度,如果指定的pivot元素不存在,則返回-1。
LLEN
LLEN命令用于獲取列表的長度,即列表中元素的數(shù)量。語法:LLEN key
127.0.0.1:6379> lrange key 0 -1 1) "a" 2) "111" 3) "b" 4) "222" 5) "c" 6) "d" 127.0.0.1:6379> llen key (integer) 6 127.0.0.1:6379> llen key2 (integer) 0返回值:
返回列表中元素的數(shù)量。如果該
key對應(yīng)的不是一個列表,或者該列表為空,返回0。如果
key不存在,返回0。總結(jié):
LLEN命令用于獲取 Redis 列表的長度,返回列表中元素的數(shù)量。如果列表為空或不存在,返回0。
阻塞版本命令
blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和對應(yīng)非阻塞版本的作用基本?致,除了:
• 在列表中有元素的情況下,阻塞和?阻塞表現(xiàn)是?致的。但如果列表中沒有元素,非阻塞版本會理解返回 nil,但阻塞版本會根據(jù) timeout,阻塞?段時間,期間 Redis 可以執(zhí)行其他命令,但要求執(zhí)行該命令的客戶端會表現(xiàn)為阻塞狀態(tài)(如圖 2-22 )。
• 命令中如果設(shè)置了多個鍵,那么會從左向右進?遍歷鍵,?旦有一個鍵對應(yīng)的列表中可以彈出元素,命令立即返回。
• 如果多個客戶端同時多?個鍵執(zhí)行 pop,則最先執(zhí)行命令的客戶端會得到彈出的元素。圖 2-22 阻塞版本的 blpop 和 非阻塞版本 lpop 的區(qū)別



演示一下BLPOP
BLPOP命令是 阻塞式彈出(Blocking Pop)命令,它用于從一個或多個列表中彈出一個元素。如果列表為空,命令會阻塞,直到有元素可彈出為止,或者超時。語法:BLPOP key [key ...] timeout

此時再開一個服務(wù)器去增加key里面的元素

此時發(fā)現(xiàn)它在100內(nèi)只有接收到key中是否有信息即可

返回值:
如果成功彈出了元素,返回一個列表,包含兩個元素:
第一個元素是列表名稱
key。第二個元素是從該列表中彈出的值。
如果在
timeout時間內(nèi)沒有元素可彈出,命令返回nil。總結(jié):
BLPOP是 Redis 中的阻塞式彈出命令,可以從一個或多個列表中彈出元素。它會阻塞直到列表中有元素可供彈出,或者超時。如果超時,命令返回nil。此命令常用于任務(wù)隊列或消息隊列的實現(xiàn)。
BRPOP同理BLPOP
List使用場景
消息隊列
Redis 可以使用 lpush + brpop 命令組合實現(xiàn)經(jīng)典的阻塞式生產(chǎn)者-消費者模型隊列,
生產(chǎn)者客戶端使用 lpush 從列表左側(cè)插入元素,多個消費者客戶端使用 brpop 命令阻塞式地從隊列中 "爭搶" 隊首元素。通過多個客戶端來保證消費的負載均衡和高可用性。

總結(jié)
到此這篇關(guān)于Redis常見數(shù)據(jù)類型List列表使用詳解的文章就介紹到這了,更多相關(guān)Redis List列表詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis遍歷所有key的兩個命令(KEYS 和 SCAN)
這篇文章主要介紹了Redis遍歷所有key的兩個命令(KEYS 和 SCAN),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Redis持久化方式之RDB和AOF的原理及優(yōu)缺點
在Redis中,數(shù)據(jù)可以分為兩類,即內(nèi)存數(shù)據(jù)和磁盤數(shù)據(jù),Redis?提供了兩種不同的持久化方式,其中?RDB?是快照備份機制,AOF?則是追加寫操作機制,本文將詳細給大家介紹Redis?持久化方式RDB和AOF的原理及優(yōu)缺點,感興趣的同學(xué)可以跟著小編一起來學(xué)習(xí)2023-06-06

