列表(List)相當于數組或者順序表
一、通用命令
LPUSH key value1 [value2 ...]
- 在列表?
key
?的左側(頭部)插入一個或多個值。 - 示例:
LPUSH fruits apple banana
?→ 列表變為?[banana, apple]
- 在列表?
LPUSHX
?只有列表已存在時才會執行插入,若列表不存在則不進行任何操作
RPUSH key value1 [value2 ...]
- 在列表?
key
?的右側(尾部)插入一個或多個值。 - 示例:
RPUSH fruits orange
?→ 列表變為?[banana, apple, orange]
- 在列表?
RPUSHX
?只有列表已存在時才會執行插入,若列表不存在則不進行任何操作
LPOP key
- 移除并返回列表?
key
?左側的第一個元素。 - 示例:
LPOP fruits
?→ 返回?banana
,列表變為?[apple, orange]
- 移除并返回列表?
lpop后面有個count參數,表示要刪刪除幾個元素
RPOP key
- 移除并返回列表?
key
?右側的最后一個元素。 - 示例:
RPOP fruits
?→ 返回?orange
,列表變為?[apple]
- 移除并返回列表?
rpop后面有個count參數,表示要刪刪除幾個元素
LRANGE key start stop
- 返回列表?
key
?中從索引?start
?到?stop
?的元素(包含兩端)。 - 索引支持負數:
-1
?表示最后一個元素,-2
?表示倒數第二個,以此類推。 - 示例:
LRANGE fruits 0 -1
?→ 返回列表所有元素
- 返回列表?
當下標越界后,會盡可能的返回結果,返回區間內存在的元素
LLEN key
- 返回列表?
key
?的長度(元素個數)。 - 示例:
LLEN fruits
?→ 返回當前列表長度
- 返回列表?
LINDEX key index
- 返回列表?
key
?中索引為?index
?的元素。 - 示例:
LINDEX fruits 0
?→ 返回列表第一個元素
- 返回列表?
1.LINSERT
?是用于在列表的指定元素前后插入新元素的命令,其語法如下:
LINSERT key BEFORE|AFTER pivot value
參數說明:
key
:列表的鍵名BEFORE|AFTER
:指定插入位置(在 pivot 元素之前或之后)pivot
:列表中已存在的參考元素value
:要插入的新元素
LSET key index value
- 將列表?
key
?中索引為?index
?的元素設置為?value
。 - 示例:
LSET fruits 0 grape
?→ 將第一個元素改為?grape
- 將列表?
LREM key count value
- 從列表?
key
?中刪除?count
?個值為?value
?的元素。 count > 0
:從左側開始刪除;count < 0
:從右側開始刪除;count = 0
:刪除所有。- 示例:
LREM fruits 2 apple
?→ 從左側刪除 2 個?apple
- 從列表?
LTRIM key start stop
- 保留列表?
key
?中從?start
?到?stop
?的元素,刪除其他元素(修剪列表)。 - 示例:
LTRIM fruits 0 1
?→ 只保留前兩個元素
- 保留列表?
RPOPLPUSH source destination
- 從?
source
?列表右側彈出元素,同時將其插入?destination
?列表左側。 - 示例:
RPOPLPUSH fruits backups
?→ 轉移最后一個元素到?backups
?列表頭部
- 從?
? 5、BLPOP和BRPOP
在 Redis 中,BLPOP
?和?BRPOP
?是?阻塞式列表彈出命令,核心作用是從列表(List)的頭部或尾部彈出元素;若列表為空,則命令會阻塞當前客戶端,直到有元素可用或超時,常用于實現?消息隊列、任務調度、分布式鎖等待?等場景。
一、核心定義與語法
兩者邏輯一致,僅彈出元素的位置不同:
BLPOP
(Block Left Pop):從列表?頭部(左側)?彈出元素,空列表時阻塞。BRPOP
(Block Right Pop):從列表?尾部(右側)?彈出元素,空列表時阻塞。
1. 基本語法
BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
參數說明:
參數 | 含義 |
---|---|
key [key...] | 1 個或多個列表鍵(支持同時監聽多個列表,按順序優先級處理)。 |
timeout | 阻塞超時時間(單位:秒): - 若? timeout=0 :永久阻塞,直到有元素彈出;- 若? timeout>0 :超時后返回?nil ,不阻塞。 |
2. 返回值
命令返回一個?二元數組,格式如下:
返回值結構 | 說明 |
---|---|
第一個元素 | 彈出元素所屬的?列表鍵名(若監聽多個鍵,需通過此值判斷元素來源)。 |
第二個元素 | 從列表中彈出的?具體元素值。 |
超時返回 | 若超時且無元素,返回?nil 。 |
二、核心特性與差異
1. 共性:阻塞邏輯與優先級
無論?BLPOP
?還是?BRPOP
,阻塞時均遵循以下規則:
- 空列表阻塞:若所有監聽的列表均為空,客戶端會進入?阻塞狀態(不占用 CPU,Redis 會將其加入 “阻塞客戶端隊列”),不影響其他命令執行。
- 元素觸發喚醒:當其他客戶端向任一監聽列表添加元素(如?
LPUSH
/RPUSH
)時,Redis 會立即喚醒阻塞的客戶端,執行彈出操作。 - 多鍵優先級:若同時監聽多個列表(如?
BLPOP list1 list2 0
),Redis 會?按鍵的順序依次檢查,僅從第一個非空列表中彈出元素(list1 優先級高于 list2)。 - 單元素原子性:即使多個客戶端同時阻塞監聽同一個列表,Redis 會保證?每個元素僅被一個客戶端彈出(原子操作,無 “競態問題”)。
2. 差異:彈出位置與典型場景
命令 | 彈出位置 | 典型使用場景 |
---|---|---|
BLPOP | 列表頭部 | 1. 實現 “先進先出(FIFO)” 隊列(配合?RPUSH ?入隊);2. 優先級隊列(頭部元素優先處理)。 |
BRPOP | 列表尾部 | 1. 實現 “后進先出(LIFO)” 棧(配合?RPUSH ?入棧);2. 簡單消息隊列(尾部彈出避免頭部阻塞)。 |
三、使用示例
假設存在兩個列表?task_queue
(任務隊列)和?urgent_queue
(緊急任務隊列),用?BLPOP
?優先處理緊急任務:
1. 列表為空時阻塞
執行命令(超時時間 30 秒):
BLPOP urgent_queue task_queue 30
此時兩個列表均為空,客戶端進入?阻塞狀態,等待元素插入。
2. 其他客戶端插入元素
另一個客戶端向?urgent_queue
?插入緊急任務:
RPUSH urgent_queue "fix_login_bug"
3. 阻塞客戶端被喚醒并返回結果
原阻塞客戶端立即被喚醒,返回以下結果(二元數組):
1) "urgent_queue" # 元素所屬的鍵
2) "fix_login_bug" # 彈出的元素值
4. 超時無元素返回
若 30 秒內無任何客戶端向?urgent_queue
?或?task_queue
?插入元素,命令超時返回?nil
:
(nil)
四、關鍵注意事項
阻塞僅影響當前客戶端
阻塞期間,當前客戶端無法執行其他命令,但 Redis 服務器仍可正常處理其他客戶端的請求(非全局阻塞)。避免永久阻塞(timeout=0)的風險
若設置?timeout=0
(永久阻塞),需確保有其他客戶端會向監聽列表插入元素;否則當前客戶端會一直阻塞,需通過?CLIENT KILL
?命令強制關閉連接。鍵不存在的處理
若監聽的鍵不存在(如?BLPOP non_exist_key 5
),Redis 會將其視為 “空列表”,同樣觸發阻塞,直到鍵被創建并插入元素。與非阻塞命令的區別(LPOP/RPOP)
LPOP/RPOP
:列表為空時立即返回?nil
,不阻塞;BLPOP/BRPOP
:列表為空時阻塞,適合需要 “等待元素” 的場景(如消息隊列消費者)。
分布式場景的限制
若多個客戶端同時阻塞監聽同一個列表,Redis 會按?“先阻塞先喚醒”?的順序分配元素(公平性保證),但不支持 “廣播”(一個元素僅被一個客戶端消費)。
五、典型應用場景
消息隊列(MQ)
- 生產者:用?
RPUSH
?向列表尾部插入消息; - 消費者:用?
BRPOP
?阻塞監聽列表,有消息時立即消費(避免輪詢空列表,減少資源浪費)。
- 生產者:用?
分布式任務調度
多個 worker 進程用?BLPOP
?監聽同一個任務列表,Redis 自動將任務分配給空閑 worker(原子性彈出,避免重復處理)。分布式鎖的 “等待重試”
當客戶端獲取鎖失敗時,用?BLPOP
?阻塞監聽 “鎖釋放通知列表”,待持有鎖的客戶端釋放鎖后,通過?LPUSH
?通知等待客戶端重試,減少輪詢開銷。