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

LPUSH
LPUSH命令用于將一個(gè)或多個(gè)元素插入到列表的頭部(即左側(cè))。如果列表不存在,Redis 會(huì)自動(dòng)創(chuàng)建一個(gè)空列表并執(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"返回值
- 返回插入元素后的列表長(zhǎng)度。
LPUSHX
LPUSHX是一個(gè)用于將元素推入到列表(list)頭部的命令,但與LPUSH不同的是,LPUSHX只有在列表已存在的情況下才會(huì)執(zhí)行操作。如果列表不存在,LPUSHX不會(huì)做任何操作,也不會(huì)創(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)存在的列表中,它不會(huì)創(chuàng)建新的列表,這與LPUSH(無論列表是否存在都創(chuàng)建新列表)有所不同。
RPUSH
RPUSH命令用于將一個(gè)或多個(gè)元素插入到列表的尾部(即右側(cè))。如果列表不存在,Redis 會(huì)自動(dòng)創(chuàng)建一個(gè)空列表并執(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"返回值:
- 返回插入元素后的列表長(zhǎng)度。
RPUSHX 同理 LPUSHX
LRANGE
LRANGE命令用于獲取列表中的一個(gè)指定范圍的元素。你可以指定開始和結(jié)束的索引位置,然后 Redis 會(huì)返回該范圍內(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)的所有元素。如果范圍超出列表長(zhǎng)度,Redis 會(huì)返回所有符合范圍條件的元素。
總結(jié):
LRANGE用于獲取 Redis 列表中指定范圍的元素。- 支持負(fù)數(shù)索引,可以從列表尾部獲取元素。
- 如果
start和stop超出了列表的實(shí)際長(zhǎng)度,Redis 會(huì)自動(dòng)調(diào)整范圍。
LPOP
LPOP命令用于從列表的頭部(左側(cè))移除并返回一個(gè)元素。執(zhí)行該命令時(shí),列表的第一個(gè)元素會(huì)被移除,并返回這個(gè)被移除的元素。如果列表為空,LPOP會(huì)返回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是一個(gè)用于從 Redis 列表左側(cè)移除并返回一個(gè)元素的命令。如果列表為空,返回nil。
RPOP 同理
RPOP 命令用于從列表的尾部(右側(cè))移除并返回一個(gè)元素。執(zhí)行該命令時(shí),列表的最后一個(gè)元素會(huì)被移除,并返回該元素。如果列表為空,RPOP 會(huì)返回 nil。
LINDEX
LINDEX命令用于獲取列表中指定位置的元素。你可以通過指定一個(gè)索引來獲取列表中對(duì)應(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ù)索引或負(fù)數(shù)索引來指定位置。如果索引超出范圍,返回nil。這是一個(gè)讀取操作,而不會(huì)改變列表內(nèi)容
LINSERT
LINSERT命令用于在列表中指定位置插入一個(gè)元素。你可以在列表的 左側(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"返回值:
如果操作成功,返回列表的新長(zhǎng)度。
如果
pivot元素在列表中不存在,則不插入任何元素,返回-1。總結(jié):
LINSERT命令在 Redis 列表中指定位置插入一個(gè)新元素??梢栽谥付ㄔ氐?前 或 后 插入。它是一個(gè)修改列表的命令,成功執(zhí)行后返回新的列表長(zhǎng)度,如果指定的pivot元素不存在,則返回-1。
LLEN
LLEN命令用于獲取列表的長(zhǎng)度,即列表中元素的數(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對(duì)應(yīng)的不是一個(gè)列表,或者該列表為空,返回0。如果
key不存在,返回0。總結(jié):
LLEN命令用于獲取 Redis 列表的長(zhǎng)度,返回列表中元素的數(shù)量。如果列表為空或不存在,返回0。
阻塞版本命令
blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和對(duì)應(yīng)非阻塞版本的作用基本?致,除了:
• 在列表中有元素的情況下,阻塞和?阻塞表現(xiàn)是?致的。但如果列表中沒有元素,非阻塞版本會(huì)理解返回 nil,但阻塞版本會(huì)根據(jù) timeout,阻塞?段時(shí)間,期間 Redis 可以執(zhí)行其他命令,但要求執(zhí)行該命令的客戶端會(huì)表現(xiàn)為阻塞狀態(tài)(如圖 2-22 )。
• 命令中如果設(shè)置了多個(gè)鍵,那么會(huì)從左向右進(jìn)?遍歷鍵,?旦有一個(gè)鍵對(duì)應(yīng)的列表中可以彈出元素,命令立即返回。
• 如果多個(gè)客戶端同時(shí)多?個(gè)鍵執(zhí)行 pop,則最先執(zhí)行命令的客戶端會(huì)得到彈出的元素。圖 2-22 阻塞版本的 blpop 和 非阻塞版本 lpop 的區(qū)別



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

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

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

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

總結(jié)
到此這篇關(guān)于Redis常見數(shù)據(jù)類型List列表使用詳解的文章就介紹到這了,更多相關(guān)Redis List列表詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis高可用部署架構(gòu)的實(shí)現(xiàn)
本文主要介紹了Redis高可用部署架構(gòu)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
了解redis中RDB結(jié)構(gòu)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了redis中RDB結(jié)構(gòu),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Redis分布式鎖的正確實(shí)現(xiàn)方法總結(jié)
在本篇文章里小編給大家整理的是關(guān)于Redis分布式鎖的正確實(shí)現(xiàn)方式介紹,有興趣的朋友們可以學(xué)習(xí)下。2020-02-02
Spring?Boot?整合Redis?實(shí)現(xiàn)優(yōu)惠卷秒殺?一人一單功能
這篇文章主要介紹了Spring?Boot?整合Redis?實(shí)現(xiàn)優(yōu)惠卷秒殺?一人一單,在分布式系統(tǒng)下,高并發(fā)的場(chǎng)景下,會(huì)出現(xiàn)此類庫存超賣問題,本篇文章介紹了采用樂觀鎖來解決,需要的朋友可以參考下2022-09-09
Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機(jī)自啟動(dòng)
Redis是一種鍵值對(duì)數(shù)據(jù)庫,也稱為內(nèi)存數(shù)據(jù)庫,因?yàn)樗梢詫?shù)據(jù)存儲(chǔ)在內(nèi)存中,而不是在磁盤上,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機(jī)自啟動(dòng)的相關(guān)資料,需要的朋友可以參考下2024-01-01

