最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis中RPOP、BRPOP、LPOP和BLPOP使用示例代碼

 更新時間:2026年05月08日 10:37:52   作者:AI浩  
這篇文章主要介紹了Redis中RPOP、BRPOP、LPOP和BLPOP使用的相關資料,解釋了列表的方向,并詳細說明了每個命令的功能、返回值、使用場景,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

核心概念:列表的方向

在深入命令之前,必須明確 Redis 列表的“方向”概念:

  • 頭部 (Left/Head): 列表的起始端。
  • 尾部 (Right/Tail): 列表的結束端。

想象一個列表 ["A", "B", "C"]

  • 頭部"A"。
  • 尾部"C"

1.RPOP: 從尾部彈出 (非阻塞)

命令RPOP key

功能:移除并返回列表 key最后一個元素(即尾部元素)。

阻塞。這是一個立即返回的命令。

返回值

  • 如果列表存在且非空:返回被彈出的元素。
  • 如果列表不存在或為空:返回 nil。

使用場景:當你需要一個簡單的棧 (Stack) 數(shù)據(jù)結構時(后進先出,LIFO)。

示例

# 創(chuàng)建一個列表
127.0.0.1:6379> RPUSH mylist "A" "B" "C"
(integer) 3

# 查看列表內容
127.0.0.1:6379> LRANGE mylist 0 -1
1) "A"
2) "B"
3) "C"

# 執(zhí)行 RPOP,彈出尾部元素 "C"
127.0.0.1:6379> RPOP mylist
"C"

# 再次查看,"C" 已被移除
127.0.0.1:6379> LRANGE mylist 0 -1
1) "A"
2) "B"

# 再次 RPOP,彈出 "B"
127.0.0.1:6379> RPOP mylist
"B"

# 列表為空時,返回 nil
127.0.0.1:6379> RPOP mylist
(nil)

2.BRPOP: 從尾部彈出 (阻塞)

命令BRPOP key [key ...] timeout

功能RPOP阻塞版本。它會移除并返回列表的最后一個元素。如果所有給定的列表都為空,它會阻塞連接,直到有元素可用或超時。

阻塞。這是其核心特性。

返回值

  • 成功彈出:返回一個包含兩個元素的數(shù)組 [key, value]。
  • 超時:返回 nil。

使用場景:實現(xiàn)消費者,用于任務隊列或消息隊列,避免輪詢。

示例

終端 A (消費者):

# 嘗試從 mylist 彈出元素,最多阻塞 5 秒
127.0.0.1:6379> BRPOP mylist 5
(等待中...)

終端 B (生產(chǎn)者):

# 向 mylist 推送一個新元素
127.0.0.1:6379> LPUSH mylist "New Task"
(integer) 1

終端 A (消費者):

# 立即收到響應
1) "mylist"      # 元素來自哪個鍵
2) "New Task"    # 被彈出的元素值

超時示例:

# 5秒內沒有任何元素被推入
127.0.0.1:6379> BRPOP emptylist 5
(nil)
(5.04s)

3.LPOP: 從頭部彈出 (非阻塞)

命令LPOP key

功能:移除并返回列表 key第一個元素(即頭部元素)。

阻塞。

返回值

  • 如果列表存在且非空:返回被彈出的元素。
  • 如果列表不存在或為空:返回 nil

使用場景:與 RPOP 相反,如果你將列表用作棧,并希望從另一端操作。

示例

# 使用之前的列表 ["A", "B"]
127.0.0.1:6379> LRANGE mylist 0 -1
1) "A"
2) "B"

# 執(zhí)行 LPOP,彈出頭部元素 "A"
127.0.0.1:6379> LPOP mylist
"A"

# 列表現(xiàn)在只剩下 ["B"]
127.0.0.1:6379> LRANGE mylist 0 -1
1) "B"

4.BLPOP: 從頭部彈出 (阻塞)

命令BLPOP key [key ...] timeout

功能LPOP阻塞版本。它會移除并返回列表的第一個元素。如果所有給定的列表都為空,它會阻塞連接,直到有元素可用或超時。

阻塞

返回值

  • 成功彈出:返回一個包含兩個元素的數(shù)組 [key, value]。
  • 超時:返回 nil

使用場景:這是最常用的隊列消費模式。配合 RPUSH(從尾部推入),可以完美實現(xiàn)先進先出 (FIFO) 的隊列。

示例 (FIFO 隊列)

生產(chǎn)者:

# 依次將任務推入隊列尾部
127.0.0.1:6379> RPUSH task_queue "Task-1"
(integer) 1
127.0.0.1:6379> RPUSH task_queue "Task-2"
(integer) 2

消費者:

# 從隊列頭部阻塞式地獲取任務
127.0.0.1:6379> BLPOP task_queue 0
1) "task_queue"
2) "Task-1"  # 最先推入的任務最先被消費

# 再次執(zhí)行,獲取下一個任務
127.0.0.1:6379> BLPOP task_queue 0
1) "task_queue"
2) "Task-2"

Python代碼示例

首先,請確保你已經(jīng)安裝了 redis 庫:

pip install redis

1. 基礎設置

我們先創(chuàng)建一個 Redis 連接,并定義一個輔助函數(shù)來清理測試用的 key。

import redis
import time
import threading

# 創(chuàng)建 Redis 連接
r = redis.Redis(host='localhost', port=6379, decode_responses=True)

def cleanup_keys(*keys):
    """清理測試用的 keys"""
    r.delete(*keys)

2.RPOP和LPOP示例 (非阻塞)

這兩個命令會立即返回結果,無論列表是否為空。

# 清理環(huán)境
cleanup_keys('test_list')

# 向列表中添加元素
r.rpush('test_list', 'A', 'B', 'C')
print("初始列表:", r.lrange('test_list', 0, -1))  # ['A', 'B', 'C']

# LPOP: 從頭部彈出
head_element = r.lpop('test_list')
print("LPOP 彈出:", head_element)  # A
print("LPOP 后列表:", r.lrange('test_list', 0, -1))  # ['B', 'C']

# RPOP: 從尾部彈出
tail_element = r.rpop('test_list')
print("RPOP 彈出:", tail_element)  # C
print("RPOP 后列表:", r.lrange('test_list', 0, -1))  # ['B']

# 對空列表操作
empty_lpop = r.lpop('empty_list')
empty_rpop = r.rpop('empty_list')
print("空列表 LPOP:", empty_lpop)  # None
print("空列表 RPOP:", empty_rpop)  # None

輸出:

初始列表: ['A', 'B', 'C']
LPOP 彈出: A
LPOP 后列表: ['B', 'C']
RPOP 彈出: C
RPOP 后列表: ['B']
空列表 LPOP: None
空列表 RPOP: None

3.BLPOP示例 (阻塞式隊列消費者)

BLPOP 是實現(xiàn) FIFO(先進先出)隊列的標準方式。生產(chǎn)者使用 RPUSH,消費者使用 BLPOP。

# 清理環(huán)境
cleanup_keys('task_queue')

def producer():
    """模擬生產(chǎn)者,每隔2秒推送一個任務"""
    for i in range(3):
        task = f"Task-{i+1}"
        r.rpush('task_queue', task)
        print(f"[生產(chǎn)者] 推送任務: {task}")
        time.sleep(2)

def blpop_consumer():
    """BLPOP 消費者,阻塞等待任務"""
    print("[BLPOP消費者] 開始等待任務...")
    while True:
        # 阻塞等待,超時時間設為5秒
        result = r.blpop('task_queue', timeout=5)
        if result is None:
            print("[BLPOP消費者] 超時,沒有收到新任務,退出。")
            break
        key, value = result
        print(f"[BLPOP消費者] 處理任務: {value} (來自 {key})")

# 啟動生產(chǎn)者線程
producer_thread = threading.Thread(target=producer)
producer_thread.start()

# 運行消費者
blpop_consumer()

# 等待生產(chǎn)者線程結束
producer_thread.join()

輸出:

[BLPOP消費者] 開始等待任務...[生產(chǎn)者] 推送任務: Task-1

[BLPOP消費者] 處理任務: Task-1 (來自 task_queue)
[生產(chǎn)者] 推送任務: Task-2
[BLPOP消費者] 處理任務: Task-2 (來自 task_queue)
[生產(chǎn)者] 推送任務: Task-3[BLPOP消費者] 處理任務: Task-3 (來自 task_queue)

[BLPOP消費者] 超時,沒有收到新任務,退出。

4.BRPOP示例 (阻塞式棧或反向隊列)

BRPOP 通常與 LPUSH 配合,也可以實現(xiàn) FIFO 隊列,但更常用于實現(xiàn) LIFO(后進先出)的棧。

# 清理環(huán)境
cleanup_keys('stack')

def brpop_consumer():
    """BRPOP 消費者,模擬一個棧的彈出操作"""
    print("[BRPOP消費者] 開始從棧中彈出元素...")
    # 先手動壓入一些元素
    r.lpush('stack', 'X', 'Y', 'Z')  # 棧: ['Z', 'Y', 'X'] (Z 在頂部/尾部)
    print("當前棧內容:", r.lrange('stack', 0, -1))

    # 彈出3次
    for _ in range(3):
        result = r.brpop('stack', timeout=1)
        if result:
            key, value = result
            print(f"[BRPOP消費者] 彈出: {value}")
    
    # 嘗試在空棧上彈出,會超時
    result = r.brpop('stack', timeout=2)
    print("[BRPOP消費者] 空棧彈出結果:", result)  # None

brpop_consumer()

輸出:

[BRPOP消費者] 開始從棧中彈出元素...
當前棧內容: ['Z', 'Y', 'X']
[BRPOP消費者] 彈出: X
[BRPOP消費者] 彈出: Y
[BRPOP消費者] 彈出: Z
[BRPOP消費者] 空棧彈出結果: None

5.BLPOP/BRPOP監(jiān)聽多個列表 (優(yōu)先級隊列)

這是阻塞命令的一個強大特性,可以用于實現(xiàn)簡單的優(yōu)先級隊列。

# 清理環(huán)境
cleanup_keys('high_priority', 'low_priority')

def multi_list_producer():
    """向高優(yōu)先級和低優(yōu)先級隊列推送任務"""
    time.sleep(1)  # 稍等一下,讓消費者先啟動
    r.rpush('low_priority', 'Low-Priority-Task')
    print("[生產(chǎn)者] 推送低優(yōu)先級任務")
    time.sleep(1)
    r.rpush('high_priority', 'High-Priority-Task')
    print("[生產(chǎn)者] 推送高優(yōu)先級任務")

def priority_consumer():
    """消費者優(yōu)先監(jiān)聽高優(yōu)先級隊列"""
    print("[優(yōu)先級消費者] 啟動,優(yōu)先監(jiān)聽: high_priority, low_priority")
    # BLPOP 會按順序檢查列表
    for _ in range(2):
        result = r.blpop(['high_priority', 'low_priority'], timeout=5)
        if result:
            key, value = result
            print(f"[優(yōu)先級消費者] 處理任務: {value} (來自 {key})")

# 啟動生產(chǎn)者線程
prod_thread = threading.Thread(target=multi_list_producer)
prod_thread.start()

# 運行消費者
priority_consumer()

prod_thread.join()

輸出:

[優(yōu)先級消費者] 啟動,優(yōu)先監(jiān)聽: high_priority, low_priority
[生產(chǎn)者] 推送低優(yōu)先級任務
[優(yōu)先級消費者] 處理任務: Low-Priority-Task (來自 low_priority)
[生產(chǎn)者] 推送高優(yōu)先級任務
[優(yōu)先級消費者] 處理任務: High-Priority-Task (來自 high_priority)

總結對比表

命令功能彈出方向阻塞典型用途
RPOP移除并返回最后一個元素尾部 (Right)棧 (LIFO)
BRPOP阻塞式移除并返回最后一個元素尾部 (Right)消費者(配合 LPUSH 實現(xiàn) FIFO)
LPOP移除并返回第一個元素頭部 (Left)棧 (LIFO) (另一端)
BLPOP阻塞式移除并返回第一個元素頭部 (Left)標準隊列消費者 (FIFO) (配合 RPUSH)

關鍵記憶點

  • L 開頭的命令操作頭部。
  • R 開頭的命令操作尾部
  • B 開頭的命令是阻塞版本。
  • 標準 FIFO 隊列 = RPUSH (生產(chǎn)者) + BLPOP (消費者)

到此這篇關于Redis中RPOP、BRPOP、LPOP和BLPOP使用示例代碼的文章就介紹到這了,更多相關Redis中RPOP、BRPOP、LPOP和BLPOP內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • redis中List列表常見命令及使用場景

    redis中List列表常見命令及使用場景

    這篇文章主要給大家介紹了關于redis中List列表常見命令及使用場景的相關資料,Redis列表是簡單的字符串列表,按照插入順序排序,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • Redis迷你版微信搶紅包實戰(zhàn)

    Redis迷你版微信搶紅包實戰(zhàn)

    本文主要介紹了Redis迷你版微信搶紅包實戰(zhàn)
    2025-05-05
  • Redis可視化連接服務器的方法

    Redis可視化連接服務器的方法

    這篇文章主要介紹了Redis可視化連接服務器的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 關于Redis庫存超賣問題的分析

    關于Redis庫存超賣問題的分析

    在高并發(fā)場景下進行優(yōu)惠券秒殺測試時,發(fā)現(xiàn)由于并發(fā)操作導致了超賣問題,即理論上只能賣出100個優(yōu)惠券,實際賣出了102個,分析原因,是因為在高并發(fā)環(huán)境下,多個線程同時操作庫存,導致數(shù)據(jù)不一致,提出了兩種解決方案:悲觀鎖和樂觀鎖
    2024-11-11
  • 淺析redis cluster介紹與gossip協(xié)議

    淺析redis cluster介紹與gossip協(xié)議

    這篇文章主要介紹了redis cluster介紹與gossip協(xié)議,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 一文了解發(fā)現(xiàn)并解決Redis熱key與大key問題

    一文了解發(fā)現(xiàn)并解決Redis熱key與大key問題

    熱key是服務端的常見問題,本文主要介紹Redis熱key與大key問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05
  • 淺談Redis變慢的原因及排查方法

    淺談Redis變慢的原因及排查方法

    本文主要介紹了淺談Redis變慢的原因及排查方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • Redis鎖與DB鎖的使用與區(qū)別小結

    Redis鎖與DB鎖的使用與區(qū)別小結

    本文主要介紹了Redis鎖與DB鎖的使用與區(qū)別小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-03-03
  • redis和redisson實現(xiàn)分布式鎖的操作方法

    redis和redisson實現(xiàn)分布式鎖的操作方法

    使用 Redis 實現(xiàn)分布式鎖,最直接的想法是利用 setnx 和 expire 命令實現(xiàn)加鎖,這篇文章主要介紹了redis和redisson實現(xiàn)分布式鎖的操作方法,需要的朋友可以參考下
    2024-03-03
  • Redis的過期策略以及內存淘汰機制詳解

    Redis的過期策略以及內存淘汰機制詳解

    文章詳解Redis的過期策略(定時刪除、惰性刪除、定時掃描)和緩存淘汰算法(如LFU、LRU等),強調定時掃描通過隨機抽樣處理過期鍵,惰性刪除在訪問時清除過期鍵,同時指出需避免大量鍵同時過期,且主從同步延遲可能導致數(shù)據(jù)不一致,建議業(yè)務中合理設置過期時間與淘汰策略
    2025-08-08

最新評論

沭阳县| 五家渠市| 天水市| 塔城市| 清流县| 乌兰浩特市| 灵寿县| 苍溪县| 牙克石市| 香河县| 乌恰县| 黑河市| 阿坝县| 杂多县| 二连浩特市| 华蓥市| 新平| 呼和浩特市| 枝江市| 夏邑县| 宣城市| 高密市| 华宁县| 西吉县| 嘉兴市| 天台县| 静安区| 阿尔山市| 淳化县| 岳普湖县| 嘉义市| 汕尾市| 德保县| 姜堰市| 措勤县| 鹤庆县| 青神县| 嘉荫县| 陇南市| 公安县| 星座|