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
R
P
USH
命令用于將一個(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遍歷所有key的兩個(gè)命令(KEYS 和 SCAN)
這篇文章主要介紹了Redis遍歷所有key的兩個(gè)命令(KEYS 和 SCAN),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Redis持久化方式之RDB和AOF的原理及優(yōu)缺點(diǎn)
在Redis中,數(shù)據(jù)可以分為兩類,即內(nèi)存數(shù)據(jù)和磁盤數(shù)據(jù),Redis?提供了兩種不同的持久化方式,其中?RDB?是快照備份機(jī)制,AOF?則是追加寫操作機(jī)制,本文將詳細(xì)給大家介紹Redis?持久化方式RDB和AOF的原理及優(yōu)缺點(diǎn),感興趣的同學(xué)可以跟著小編一起來學(xué)習(xí)2023-06-06基于session?Redis實(shí)現(xiàn)登錄
這篇文章主要介紹了基于session?Redis實(shí)現(xiàn)登錄的相關(guān)資料,需要的朋友可以參考下2023-10-10Redis中SDS簡(jiǎn)單動(dòng)態(tài)字符串詳解
Redis中的SDS(Simple?Dynamic?String)是一種自動(dòng)擴(kuò)容的字符串實(shí)現(xiàn)方式,它可以提供高效的字符串操作,并且支持二進(jìn)制安全。SDS的設(shè)計(jì)使得它可以在O(1)時(shí)間內(nèi)實(shí)現(xiàn)字符串長(zhǎng)度的獲取和修改,同時(shí)也可以在O(N)的時(shí)間內(nèi)進(jìn)行字符串的拼接和截取。2023-04-04