redis----list詳解

列表(List)相當于數組或者順序表

一、通用命令

  1. LPUSH key value1 [value2 ...]

    • 在列表?key?的左側(頭部)插入一個或多個值。
    • 示例:LPUSH fruits apple banana?→ 列表變為?[banana, apple]

  • LPUSHX?只有列表已存在時才會執行插入,若列表不存在則不進行任何操作
  1. RPUSH key value1 [value2 ...]

    • 在列表?key?的右側(尾部)插入一個或多個值。
    • 示例:RPUSH fruits orange?→ 列表變為?[banana, apple, orange]

RPUSHX?只有列表已存在時才會執行插入,若列表不存在則不進行任何操作

  1. LPOP key

    • 移除并返回列表?key?左側的第一個元素。
    • 示例:LPOP fruits?→ 返回?banana,列表變為?[apple, orange]

lpop后面有個count參數,表示要刪刪除幾個元素

  1. RPOP key

    • 移除并返回列表?key?右側的最后一個元素。
    • 示例:RPOP fruits?→ 返回?orange,列表變為?[apple]

rpop后面有個count參數,表示要刪刪除幾個元素

  1. LRANGE key start stop

    • 返回列表?key?中從索引?start?到?stop?的元素(包含兩端)。
    • 索引支持負數:-1?表示最后一個元素,-2?表示倒數第二個,以此類推。
    • 示例:LRANGE fruits 0 -1?→ 返回列表所有元素

當下標越界后,會盡可能的返回結果,返回區間內存在的元素

  1. LLEN key

    • 返回列表?key?的長度(元素個數)。
    • 示例:LLEN fruits?→ 返回當前列表長度

  1. LINDEX key index

    • 返回列表?key?中索引為?index?的元素。
    • 示例:LINDEX fruits 0?→ 返回列表第一個元素

1.LINSERT?是用于在列表的指定元素前后插入新元素的命令,其語法如下:

LINSERT key BEFORE|AFTER pivot value

參數說明

  • key:列表的鍵名
  • BEFORE|AFTER:指定插入位置(在 pivot 元素之前或之后)
  • pivot:列表中已存在的參考元素
  • value:要插入的新元素
  1. LSET key index value

    • 將列表?key?中索引為?index?的元素設置為?value
    • 示例:LSET fruits 0 grape?→ 將第一個元素改為?grape
  2. LREM key count value

    • 從列表?key?中刪除?count?個值為?value?的元素。
    • count > 0:從左側開始刪除;count < 0:從右側開始刪除;count = 0:刪除所有。
    • 示例:LREM fruits 2 apple?→ 從左側刪除 2 個?apple
  3. LTRIM key start stop

    • 保留列表?key?中從?start?到?stop?的元素,刪除其他元素(修剪列表)。
    • 示例:LTRIM fruits 0 1?→ 只保留前兩個元素
  4. 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)

四、關鍵注意事項

  1. 阻塞僅影響當前客戶端
    阻塞期間,當前客戶端無法執行其他命令,但 Redis 服務器仍可正常處理其他客戶端的請求(非全局阻塞)。

  2. 避免永久阻塞(timeout=0)的風險
    若設置?timeout=0(永久阻塞),需確保有其他客戶端會向監聽列表插入元素;否則當前客戶端會一直阻塞,需通過?CLIENT KILL?命令強制關閉連接。

  3. 鍵不存在的處理
    若監聽的鍵不存在(如?BLPOP non_exist_key 5),Redis 會將其視為 “空列表”,同樣觸發阻塞,直到鍵被創建并插入元素。

  4. 與非阻塞命令的區別(LPOP/RPOP)

    • LPOP/RPOP:列表為空時立即返回?nil,不阻塞;
    • BLPOP/BRPOP:列表為空時阻塞,適合需要 “等待元素” 的場景(如消息隊列消費者)。
  5. 分布式場景的限制
    若多個客戶端同時阻塞監聽同一個列表,Redis 會按?“先阻塞先喚醒”?的順序分配元素(公平性保證),但不支持 “廣播”(一個元素僅被一個客戶端消費)。

五、典型應用場景

  1. 消息隊列(MQ)

    • 生產者:用?RPUSH?向列表尾部插入消息;
    • 消費者:用?BRPOP?阻塞監聽列表,有消息時立即消費(避免輪詢空列表,減少資源浪費)。
  2. 分布式任務調度
    多個 worker 進程用?BLPOP?監聽同一個任務列表,Redis 自動將任務分配給空閑 worker(原子性彈出,避免重復處理)。

  3. 分布式鎖的 “等待重試”
    當客戶端獲取鎖失敗時,用?BLPOP?阻塞監聽 “鎖釋放通知列表”,待持有鎖的客戶端釋放鎖后,通過?LPUSH?通知等待客戶端重試,減少輪詢開銷。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95066.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95066.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95066.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【python】相機輸出圖片時保留時間戳數據

有時候需要參考時間戳&#xff0c;寫個筆記記錄下 但是輸出時間可能不穩&#xff0c;有待進一步優化 import cv2 import time import os# 創建一個保存圖像的文件夾 output_folder "camera_images" if not os.path.exists(output_folder):os.makedirs(output_folder…

(Nginx)基于Nginx+PHP 驅動 Web 應用(上):配置文件與虛擬主機篇

1.應用場景 主要用于學習基于 Nginx PHP 驅動 Web 應用&#xff08;上&#xff09;&#xff1a; 配置文件與虛擬主機篇&#xff0c;學習弄清楚Nginx的常規操作&#xff0c;之前困惑的地方。 本文主要介紹了基于NginxPHP驅動Web應用的配置方法&#xff0c;重點講解了Nginx配置…

【golang長途旅行第34站】網絡編程

網絡編程 基本介紹核心主題&#xff1a;?? Golang面向大規模后端服務程序的設計目標中&#xff0c;網絡通信是必不可少且至關重要的部分。?兩種網絡編程方式&#xff1a;???TCP Socket編程? ?性質&#xff1a;網絡編程的主流 ?底層協議&#xff1a;基于TCP/IP協議 ?舉…

Hadoop(六)

目錄&#xff1a;1.Hadoop概述2.為什么需要分布式存儲3.分布式的基礎架構分析4.HDFS的基礎架構1.Hadoop概述2.為什么需要分布式存儲3.分布式的基礎架構分析4.HDFS的基礎架構

Oracle 12g安裝

1. 下載地址 官方網站 一般這種導向的進入的都是oracle的官方網站(先登錄&#xff0c;如果沒有就創建賬號)&#xff0c;并沒有真實的12g供你下載。需要你轉入Oracle的云中下載&#xff1a;https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 。我選擇的是12.1.0.2.0下…

ros2--service/服務--接口

獲取service名稱const char *get_service_name() const;std::string client_name client_->get_service_name();RCLCPP_INFO(this->get_logger(), "Client name: %s", client_name.c_str());

安卓開發---SimpleAdapter

概念&#xff1a;SimpleAdapter 是 Android 中比 ArrayAdapter 更強大的適配器&#xff0c;用于將復雜的數據綁定到復雜的布局&#xff0c;支持將 Map 中的數據映射到布局中的多個 View。方法簽名&#xff1a;public SimpleAdapter( Context context, //上下文 List<? exte…

軟考-系統架構設計師 辦公自動化系統(OAS)詳細講解

個人博客&#xff1a;blogs.wurp.top 一、OAS的核心概念與演進 1. 什么是OAS&#xff1f; OAS是一個綜合性的信息系統&#xff0c;它利用計算機技術、通信技術、系統科學和行為科學&#xff0c;為組織的日常辦公事務、信息管理和協同工作提供支持。其本質是將傳統辦公流程電…

leetcode 155 官方golang標準答案錯誤

真是誤人子弟&#xff0c;leetcode155題官網的golang答案是錯誤的。push方法的append操作&#xff0c;必然不能保證是o(1)的時間復雜度。就這還是官網的標準答案&#xff0c;就這水平&#xff0c;&#x1f604;leetcode誤人子弟不是第一次了。光會刷算法&#xff0c;可惜水平還…

開源 python 應用 開發(十三)AI應用--百度智能云TTS語音合成

最近有個項目需要做視覺自動化處理的工具&#xff0c;最后選用的軟件為python&#xff0c;剛好這個機會進行系統學習。短時間學習&#xff0c;需要快速開發&#xff0c;所以記錄要點步驟&#xff0c;防止忘記。 鏈接&#xff1a; 開源 python 應用 開發&#xff08;一&#xf…

大白話說 AI 編程 Trae,小白進!

大家好&#xff0c;我是櫻木。 一些小白用戶&#xff0c;打開字節出的 AI 編程工具 Trae 時&#xff0c;可能覺得還是有點生疏&#xff0c;但是作為程序員&#xff0c;看到這樣的界面分布&#xff0c;已經是在熟悉不過了&#xff0c;甚至心中竊喜&#xff0c;長得和 IDEA 等開…

主流國產數據庫:文檔完備性

官方文檔通常是用戶獲取數據庫產品相關信息最權威的渠道&#xff0c;文檔的完備性&#xff08;準確、全面、易用&#xff09;直接影響著開發者的學習成本、項目實施的效率以及后期的運維便利性。 例如&#xff0c;Oracle 數據庫的官方文檔被廣泛認為是行業的黃金標準&#xff…

現今流行的操作系統及其應用場景

2025 年主流操作系統及其應用場景&#xff0c;結合技術趨勢與行業實踐&#xff0c;涵蓋從個人設備到關鍵基礎設施的全場景覆蓋&#xff1a;一、桌面與生產力領域1. Windows 11/12&#xff08;微軟&#xff09;市場地位&#xff1a;全球桌面市場占比 71%&#xff0c;企業級場景市…

IP v 6

相關概念地址長度128bit&#xff0c;采用冒號劃分為8段&#xff0c;并用16進制標識&#xff0c;其容量大到能為地球上的每一粒沙子分配一個地址&#xff0c;通常情況下其網絡前綴為64位&#xff0c;接口標識為64位&#xff0c;依照寫法可分為首選格式&#xff0c;即完整書寫&am…

Elasticsearch冷熱架構:性能與成本完美平衡

Elasticsearch 的冷熱架構&#xff08;Hot-Warm-Cold Architecture&#xff09;是一種針對時序數據&#xff08;如日志、指標等&#xff09;的成本與性能優化方案&#xff0c;通過將數據在不同生命周期的存儲需求分層處理&#xff0c;兼顧性能、容量和成本。其核心思想是&#…

【MFC自動生成的文件詳解:YoloClassMFC.cpp 的逐行解釋、作用及是否能刪除】

大家好&#xff0c;歡迎來到我的MFC編程入門系列。上次我們聊了MFC項目創建后的核心文件區別&#xff08;項目名.cpp、.h、Dlg.cpp 和 Dlg.h&#xff09;&#xff0c;今天針對讀者的反饋&#xff0c;專門來拆解其中最重要的一個文件&#xff1a;項目名.cpp&#xff08;這里以用…

玄機靶場 | 冰蝎3.0-jsp流量分析

文章目錄一、冰蝎3.0流量特征二、索引三、題目列表步驟#1黑客IP是什么&#xff1f;步驟#2黑客上傳的Webshell名是什么&#xff1f;步驟#3黑客上傳WebShell的時間是多少&#xff1f;&#xff08;格式如&#xff1a;flag{YYYY-MM-DD HH:MM:SS}&#xff09;步驟#4木馬的解密key是什…

基于物理信息神經網絡(Physics-Informed Neural Network, PINN)的三維熱傳導方程求解器MATLAB

代碼實現了一個基于物理信息神經網絡&#xff08;Physics-Informed Neural Network, PINN&#xff09;的三維熱傳導方程求解器。以下是詳細分析&#xff1a;&#x1f9e0; 一、主要功能 main.m&#xff1a; 構建一個全連接神經網絡用于近似三維熱傳導方程的解 ( u(x, y, z, t) …

按鈕計數器:jQuery / AngularJS / Vue / React / dagger.js 實現對比與技術解讀

代碼來源&#xff1a;https://codepen.io/dagger8224/pen/myeKgVQ 任務&#xff1a;實現“按鈕點擊 1”計數器&#xff0c;對比不同框架的寫法與特性&#xff0c;并給出選型建議。 目錄 代碼解讀&#xff08;逐框架&#xff09; jQuery&#xff08;命令式 DOM&#xff09;Angu…

useEffect中直接使用 await報錯

在 useEffect 中直接使用 await 會報錯&#xff0c;因為 useEffect 的回調函數不能是 async 函數。有幾種正確的方式來處理異步操作&#xff1a; 方法一&#xff1a;在 useEffect 內部創建 async 函數并立即調用 這是最常用的方式。 import React, { useEffect } from react;co…