Redis命令——list

列表類型是用來存儲多個有序的字符串,列表中的每個字符串稱為元素(element),?個列表最多可以存儲個元素
在 Redis 中,可以對列表兩端插入(push)和彈出(pop),還可以獲取指定范圍的元素列表、?獲取指定索引下標的元素等。列表是?種比較靈活的數據結構,它可以充當棧和隊列的角色
列表(list)相當于是 數組 或者 順序表
list 內部編碼方式并非是一個簡單的數組,而是更接近于“雙端隊列”(deque)
列表中的元素是有序的(元素位置),允許插入重復元素

常見命令

1)lpush? lpushx? rpush? rpushx

lpush key element [element ...]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? —— 頭插

返回 list 的長度? O(1)

lpushx?key element [element ...]

當 key 存在是返回 list 的長度,否則直接返回? O(1)?? ? ? ? ? ? ? ? ?—— 頭插

rpush key element [element ...]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?—— 尾插

返回 list 的長度? O(1)

rpush key element [element ...]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? —— 尾插

當 key 存在是返回 list 的長度,否則直接返回? O(1)?

若果 key 已經存在,并且 key 對應的 value 類型不是 list,此時會報錯

2)lrange

獲取從 start 到 end 區間內的所有元素(左閉右閉)

lrange key start end? (支持負數)

返回指點區間內的元素? O(N)

此處 數字 只是標識返回元素的順序(結果集),和下標無關

當給出非法下標時,Redis 會盡可能的取到給定區間內的元素(魯棒性)

3)lpop? rpop

lpop key [count]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?—— 頭刪

返回指定區間內的元素或者 nil? O(count)

rpop key [count]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?—— 尾刪

返回指定區間內的元素或者 nil? O(count)

Redis 中的 list 是一個雙端隊列,從兩頭插入/刪除是非常高效的? O(1)

rpush + lpop ——> 隊列

rpush + rpop ——> 棧

4)lindex

lindex key index

返回指定下表的元素 ,非法下標則返回 nil? O(N)

正數表示從左數,負數反之,起始點為 0

5)linsert

linsert key <before | after> pivot element

返回插入后的 list 的長度? O(N)

pivot? 基準值(從左往右)? ? element? 要插入的元素

6)len

len key

返回 list 的長度? O(1)

7)lrem

lrem key count element

返回刪除的元素個數? O(1)

count? 要刪除的元素的個數? ? ? ?element? 要刪除的元素的值

8)ltrim?

ltrim key count element

返回 ok? O(N)

保留 start 和 stop 區間內的元素(區間外的被直接刪除)

9)lset

lset key index element

返回 OK,若下表越界返回 nil? O(1)

10)blpop? brpop

?? 在列表中有元素的情況下,阻塞和非阻塞表現是?致的。但如果列表中沒有元素,非阻塞版本會理解返回 nil,但阻塞版本會根據 timeout,阻塞?段時間,期間 Redis 可以執行其他命令,但要求執行該命令的客戶端會表現為阻塞狀態
? 命令中如果設置了多個鍵,那么會從左向右進行遍歷鍵,?旦有?個鍵對應的列表中可以彈出元
素,命令立即返回。
? 如果多個客戶端同時多?個鍵執行 pop,則最先執行命令的客戶端會得到彈出的元素

blpop key [key ...] timeout? ? ? ? ? ? ? ? ? ?—— 尾刪

返回取出的元素或者 nil? O(1)

brpop key [key ...] timeout? ? ? ? ? ? ? ? ? ?—— 尾刪

返回取出的元素或者 nil? O(1)

返回結果相當于是一個pair(二元組)

一方面表示當前數據來自哪個 key? ? ? ? ??

一方面表示取到的數據是什么

生產者—消費者模型? —— BlockingQueue

使用隊列作為中間的“交易場所”(broker)

1.線程安全

2.隊列為空,嘗試出隊列,產生阻塞,直到隊列不空,阻塞解除

? ?隊列為滿,嘗試入隊列,產生阻塞,直到隊列不滿,阻塞解除

Redis 的 list 也相當于 阻塞隊列

線程安全 —— 單線程模型? ? ? ? 阻塞 —— 只支持“隊列為空”,不考慮“隊列滿”

顯示設置阻塞時間,此處不會對 Redis 服務器造成太大影響

可以同時去嘗試獲取多個鍵,一旦有一個鍵對應的列表中可以彈出元素,命令立即返回

命令如果設置了多個鍵,會從左向右進行遍歷,一旦有一個鍵對應的列表中可以彈出元素,命令立即返回

如果多個客戶端同時對一個鍵進行 blpop ,最先執行的客戶端會獲得元素

編碼方式

quecklist

相當于是 鏈表 和 壓縮列表 的結合

整體還是一個列表,鏈表的每個節點,是一個壓縮列表

每個壓縮列表都不太大,同時再把多個壓縮列表通過鏈表結構連起來

ziplist(壓縮列表)

把數據按照更緊湊的形式進行表示。

節省空間,但是數個數多了,操作效率會下降

linkedlist(鏈表)

應用場景

消息隊列

使用 lpush + brpop 組合實現 生產者-消費者?模型,在通過多個客戶端保證負載均衡和高可用性

如果列表為空,生產出的下個元素只有一個消費者可以“搶到”元素

分頻道的消息隊列

如果頻道為空,生產出的下個元素只有一個消費者可以“搶到”元素

多個頻道,可以在某種數據發生異常時,不會對其他數據造影響(解耦合)

微博 TimeLine

每個用戶都有屬于自己的 TimeLine(微博列表)

當需要分頁展示文章列表時,可以使用 list (list不僅有序,還支持按照索引范圍獲取元素)

1.)當前一頁中的有多少數據是不確定的,可能會導致下面的循環比較大,從而出發多次 hgetall(多次網絡請求)

pipeline (流水線\管道)把多個 Redis 命令合并成一次 網絡請求進行通信,降低服務器與客戶端的通信次數

2)分裂獲取文章時,lrange 在列表兩端表現比較好,獲取列表中間的元素表現比較差,可以將列表進行拆分

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

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

相關文章

Android Jetpack Compose 狀態管理解析:remember vs mutableStateOf,有啥不一樣?為啥要一起用?

&#x1f331;《Jetpack Compose 狀態管理解析&#xff1a;remember vs mutableStateOf&#xff0c;有啥不一樣&#xff1f;為啥要一起用&#xff1f;》 在 Jetpack Compose 的世界里&#xff0c;UI 是響應式的。這意味著當狀態發生變化時&#xff0c;UI 會自動重組&#xff0…

使用 PCL 和 Qt 實現點云可視化與交互

下面我將介紹如何結合點云庫(PCL)和Qt框架(特別是QML)來實現點云的可視化與交互功能&#xff0c;包括高亮選擇等效果。 1. 基本架構設計 首先需要建立一個結合PCL和Qt的基本架構&#xff1a; // PCLQtViewer.h #pragma once#include <QObject> #include <pcl/point…

mybatis plus打印sql日志到指定目錄

1、mybatis plus打印sql日志 參考文檔&#xff1a;mybatis plus打印sql日志_mybatisplus日志打印-CSDN博客 2、修改 修改InfoLevelLogger Override public void debug(String s) {// 修改這里logger.info(s);log.debug(s); } 增加&#xff1a;log.debug(s); 修改logback.x…

vue3 watch和watchEffect 的用法和區別

在 Vue 3 里&#xff0c;watch 和 watchEffect 都是用于響應式數據變化的 API&#xff0c;但它們在使用方法和應用場景上存在差異。下面詳細介紹它們的用法和區別。 用法 watch watch 用于監聽特定的響應式數據源&#xff0c;當數據源發生變化時&#xff0c;會執行相應的回調…

Qt中修改了UI設計文件后編譯不生效問題的解決辦法

復制工程過來后&#xff1a; 1、刪除build文件 2、刪除.user文件&#xff0c;恢復為文件最初的那樣 3、執行make distclean,刪除所有由先前構建過程生成的文件 4、再次打開工程&#xff0c;修改ui文件編譯生效&#xff01;

EtherCAT轉ProfiNet邊緣計算網關配置優化:汽車制造場景下PLC與機器人協同作業案例

1.行業背景與需求分析 智能汽車焊裝車間是汽車制造的核心工藝環節&#xff0c;某德國豪華品牌在其上海MEB工廠新建的焊裝車間中&#xff0c;采用西門子S7-1500PLC作為ProfiNet主站&#xff0c;負責整線協調與質量追溯&#xff1b;同時部署KUKAKR1500Titan機器人&#xff08;Eth…

day46—雙指針-兩數之和-輸入有序數組(LeetCode-167)

題目描述 給你一個下標從 1 開始的整數數組 numbers &#xff0c;該數組已按 非遞減順序排列 &#xff0c;請你從數組中找出滿足相加之和等于目標數 target 的兩個數。如果設這兩個數分別是 numbers[index1] 和 numbers[index2] &#xff0c;則 1 < index1 < index2 &l…

線性代數 | 知識點整理 Ref 1

注&#xff1a;本文為 “線性代數 | 知識點整理” 相關文章合輯。 因 csdn 篇幅合并超限分篇連載&#xff0c;本篇為 Ref 1。 略作重排&#xff0c;未整理去重。 圖片清晰度限于引文原狀。 如有內容異常&#xff0c;請看原文。 線性代數知識匯總 Arrow 于 2016-11-27 16:27:5…

比特幣的跨輸入簽名聚合(Cross-Input Signature Aggregation,CISA)

1. 引言 2024 年&#xff0c;人權基金會&#xff08;Human Rights Foundation&#xff0c;簡稱 HRF&#xff09;啟動了一項研究獎學金計劃&#xff0c;旨在探討“跨輸入簽名聚合”&#xff08;Cross-Input Signature Aggregation&#xff0c;簡稱 CISA&#xff09;的潛在影響。…

3.基礎開發工具

1.軟件包管理器 1.1什么是軟件包 ? 在Linux下安裝軟件, ?個通常的辦法是下載到程序的源代碼, 并進?編譯, 得到可執?程序. ? 但是這樣太?煩了, 于是有些?把?些常?的軟件提前編譯好, 做成軟件包(可以理解成windows上 的安裝程序)放在?個服務器上, 通過包管理器可以很…

Golang errors 包快速上手

文章目錄 1.變量2.類型3.函數3.1 New3.2 Is簡介函數簽名核心功能示例代碼使用場景注意事項小結 3.3 As簡介函數簽名核心功能示例代碼使用場景注意事項小結 3.4 Unwrap簡介函數簽名核心功能使用示例使用場景注意事項小結 3.5 Join簡介函數簽名核心功能使用場景注意事項小結 4.小…

Java File 類詳解

Java File 類詳解 File 類是 Java 中用于表示文件和目錄路徑名的抽象類&#xff0c;位于 java.io 包中。它提供了豐富的 API&#xff0c;用于操作文件系統&#xff0c;包括創建、刪除、重命名、查詢文件屬性等功能。 1. File 類核心知識點 &#xff08;1&#xff09;構造方法…

基于javaweb的SpringBoot兒童愛心管理系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

Unity Nav Mesh導航系統的簡單使用

標題 1.下載。2.面板位置3.object面板4.Area面板5.Bake面板6.Agent面板7.Nav Mesh Agent組件8.Nav Mesh Obstacle組件9.簡單使用 1.下載。 unity2022以上版本要去packageManager中下載。 2.面板位置 3.object面板 Navigation Static&#xff1a;設置該物體是否被列入靜態尋路…

FairyGUI圖標文字合批失敗的原因

1&#xff09;FairyGUI圖標文字合批失敗的原因 2&#xff09;為什么Cubemap的內存占用超高 3&#xff09;如何找到網格某個切面的中心點 4&#xff09;為什么SafeZone在倒屏后方向相反 這是第428篇UWA技術知識分享的推送&#xff0c;精選了UWA社區的熱門話題&#xff0c;涵蓋了…

[BUG]Cursor C++擴展不支持

本文內容組織形式 問題描述失效原因解決方案使用野版C Extension 猜你喜歡結語 問題描述 日期&#xff1a;20250419 操作系統&#xff1a; mac C代碼沒有辦法進行跳轉&#xff0c;并且和以前的文本標亮也不同 并且還有如下問題彈窗 C/C 擴展只能與 Microsoft Visual Studio…

深?理解 JVM 執?引擎

深?理解 JVM 執?引擎 其中前端編譯是在 JVM 虛擬機之外執?&#xff0c;所以與 JVM 虛擬機沒有太?的關系。任何編程語?&#xff0c;只要能夠編譯出 滿? JVM 規范的 Class ?件&#xff0c;就可以提交到 JVM 虛擬機執?。?于編譯的過程&#xff0c;如果你不是想要專?去研…

Ubuntu 部署 DeepSeek

在 Ubuntu 系統上部署 DeepSeek 模型&#xff0c;能讓用戶利用其強大的人工智能能力&#xff0c;同時保障數據的安全性與操作的自主性。不過&#xff0c;這一過程涉及諸多技術細節&#xff0c;需要謹慎操作。以下將為你詳細介紹在 Ubuntu 系統部署 DeepSeek 的操作步驟及注意事…

通義靈碼 Rules 庫合集來了,覆蓋Java、TypeScript、Python、Go、JavaScript 等

通義靈碼新上的外掛 Project Rules 獲得了開發者的一致好評&#xff1a;最小成本適配我的開發風格、相當把團隊經驗沉淀下來&#xff0c;是個很好功能…… 那么有哪些現成的 Rules 可以抄作業呢&#xff0c;今天我們官方輸出了 Java、TypeScript、Python、Go、JavaScript 等語…

山東大學軟件學院項目實訓-基于大模型的模擬面試系統-Token過期重定向問題

項目結構 ├── assets/ # 靜態資源&#xff08;CSS/圖片&#xff09; ├── components/ # Vue 組件 ├── layouts/ # 布局模板 ├── pages/ # 自動生成路由 ├── plugins/ # 插件&#xff08;如 axios 攔截器&#xff09; …