9.Redis之list類型

list相當于鏈表、數據表

1.list類型基本介紹

  • 列表中的元素是有序的
  • "有序"的含義,要根據上下文區分~~
  • 有的時候,談到有序,指的是"升序","降序”
  • 有的時候,談到的有序,指的是, 順序很關鍵~~
  • 如果把元素位置顛倒,順序調換.
  • 此時得到的新的 List 和之前的 List 是不等價的!!
  • 同樣一個詞,怎么理解,務必要結合上下文,結合具體場景~~
  • 棧/堆.(數據結構的,操作系統的,M 的)
  • 同步(同步和互斥的同步,還是同步和異步的同步)

1.區分獲取和刪除的區別

lindex 能獲取到元素的值
lrem 也能返回被刪除元素的值.

2.列表中的元素是允許重復的

像 hash 這樣的類型, field 是不能重復的

因為當前的 List,頭和尾都能高效的插入刪除元素, 就可以把這個 List 當做一個 棧/隊列 來使用了

Redis 有一個典型的應用場景,就是作為消息隊列

最早的時候, 就是通過 List 類型~.

后來 Redis 又提供了 stream 類 (用于消息隊列)

2.list相關命令

2.1 LPUSH

將?個或者多個元素從左側放?(頭插)到 list 中。
語法:
LPUSH key element [element ...]
命令有效版本:1.0.0 之后
時間復雜度:只插??個元素為 O(1), 插?多個元素為 O(N), N 為插?元素個數.
返回值:插?后 list 的長度。
?例:
redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
//按照順序,依次頭插這幾個元素.
//全都插入完畢,4 是在最前面的!!!
//如果 key 已經存在, 并且 key 對應的 value 類型,不是 list
//此時 lpush 命令就要報錯.
//此處的序號與下標無關,序號只是標識項,描述一下順序

2.2 LPUSHX

在 key 存在時,將?個或者多個元素從左側放?(頭插)到 list 中。不存在,直接返回
語法:
LPUSHX key element [element ...]
命令有效版本:2.0.0 之后
時間復雜度:只插??個元素為 O(1), 插?多個元素為 O(N), N 為插?元素個數.
返回值:插?后 list 的?度。
示例:
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSHX mylist "Hello"
(integer) 2
redis> LPUSHX myotherlist "Hello"
(integer) 0
redis> LRANGE mylist 0 -1
1) "Hello"
2) "World"
redis> LRANGE myotherlist 0 -1
(empty array)

2.3?RPUSH

將?個或者多個元素從右側放?(尾插)到 list 中。
語法:
RPUSH key element [element ...]
命令有效版本:1.0.0 之后
時間復雜度:只插??個元素為 O(1), 插?多個元素為 O(N), N 為插?元素個數.
返回值:插?后 list 的?度。
?例:
redis> RPUSH mylist "world"
(integer) 1
redis> RPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "world"
2) "hello"

?2.4?RPUSHX

在 key 存在時,將?個或者多個元素從右側放?(尾插)到 list 中。
語法:
RPUSHX key element [element ...]
命令有效版本:2.0.0 之后
時間復雜度:只插??個元素為 O(1), 插?多個元素為 O(N), N 為插?元素個數.
返回值:插?后 list 的?度。
?例:
redis> RPUSH mylist "World"
(integer) 1
redis> RPUSHX mylist "Hello"
(integer) 2
redis> RPUSHX myotherlist "Hello"
(integer) 0
redis> LRANGE mylist 0 -1
1) "World"
2) "Hello"
redis> LRANGE myotherlist 0 -1
(empty array)

2.5 LRANGE

獲取從 start 到 end 區間的所有元素,左閉右閉。
語法:
//此處的l不是left,而是list
LRANGE key start stop
命令有效版本:1.0.0 之后
時間復雜度:O(N)
返回值:指定區間的元素。
?例:
redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> LRANGE mylist 0 0
1) "one"
redis> LRANGE mylist -3 2
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist -100 100
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist 5 10
(empty array)

2.6 LPOP

從 list 左側取出元素(即頭刪)。
語法:
LPOP key
命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:取出的元素或者 nil。
?例:
redis> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
redis> LPOP mylist
"one"
redis> LPOP mylist
"two"
redis> LPOP mylist
"three"
redis> LRANGE mylist 0 -1
1) "four"
2) "five"

2.7 RPOP

從 list 右側取出元素(即尾刪)。
語法:
RPOP key
我們所用的版本是5 不考慮
命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:取出的元素或者 nil。
?例:
redis> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
redis> RPOP mylist
"five"
redis> LRANGE mylist 0 -1
1) "one"
2) "two"
3) "three"
4) "four"

Redis 中的 list 是一個雙端隊列~~

從兩頭插入/刪除元素都是非常高效 O(1)
搭配使用 rpush 和 lpop, 就相當于隊列了

搭配使用 rpush 和 rpop, 就相當于棧了,

2.8?LINDEX

獲取從左數第 index 位置的元素。
語法:
? LINDEX key index
命令有效版本:1.0.0 之后
時間復雜度:O(N),此處的N是list中元素的個數
返回值:取出的元素或者 nil。
?例:
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LINDEX mylist 0
"Hello"
redis> LINDEX mylist -1
"World"
redis> LINDEX mylist 3
(nil)

2.9 LINSERT

在特定位置插?元素。
語法:
LINSERT key <BEFORE | AFTER> pivot element
pivot 以該元素為基準
命令有效版本:2.2.0 之后
時間復雜度:O(N)
返回值:插?后的 list ?度。
?例:
redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2
redis> LINSERT mylist BEFORE "World" "There"
(integer) 3
redis> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"

//基準不是下標,而是元素

萬一要插入的列表中,基準值,存在多個,咋辦?
linsert 進行插入的時候,要根據基準值, 找到對應的位置,從左往右找,找到第一個符合基準值的位置即可.
O(N),N 表示列表的長度

2.10 LLEN

獲取 list ?度。
語法:
LLEN key
命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:list 的?度。
?例:
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LLEN mylist
(integer) 2

2.11 LREM

count>0,從左往右找

count<0,從右往左找

count=0,全部刪除

?2.12 LRIM

只保留區間內的數

時間復雜度是O(N),N是當前要刪除的元素的個數

2.13 LSET?

?3.阻塞版命令

  • redis 中的 list 也相當于 阻塞隊列 一樣
  • 線程安全是通過單線程模型支持的.
  • 阻塞,則只支持"隊列為空"的情況,不考慮"隊列滿”
  • 但阻塞版本會根據 timeout,阻塞一段時間,期間 Redis 可以執行其他命令使用 brpop 和 blpop 的時候,這里是可以顯式設置阻塞時間的!!!(不一定是無休止的等待!!)【此處的 blpop 和 brpop 看起來好像耗時很久,但是實際上并不會對 redis 服務器產生負面影響!!】
  • 命令中如果設置了多個鍵,那么會從左向右進行遍歷鍵,一旦有一個鍵對應的列表中可以彈出元素,命令立即返回。
    blpop 和 brpop 都是可以同時去嘗試獲取多個 key 的列表的元素的~~
    多個 key 對應多個 list這多個 |ist 哪個有元素了,就會返回哪個元素,
    如果多個客戶端同時多一個鍵執行 pop,則最先執行命令的客戶端會得到彈出的元素。
  • 區別
blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和對應?阻塞版本的作?基本?致,除了:
? 在列表中有元素的情況下,阻塞和?阻塞表現是?致的。但如果列表中沒有元素,?阻塞版本會理
解返回 nil,但阻塞版本會根據 timeout,阻塞?段時間,期間 Redis 可以執?其他命令,但要求執
?該命令的客?端會表現為阻塞狀態(如圖 2-22 所?)。
? 命令中如果設置了多個鍵,那么會從左向右進?遍歷鍵,?旦有?個鍵對應的列表中可以彈出元
素,命令?即返回。
? 如果多個客?端同時多?個鍵執? pop,則最先執?命令的客?端會得到彈出的元素。

3.1 BLPOP

LPOP 的阻塞版本。
語法:
BLPOP key [key ...] timeout
  • 此處 可以指定一個 key 或者 多個 key
  • 每個 key 都對應一個 list.
  • 如果這些 list 有任何一個非空,blpop 都能夠把這里的元素給獲取到. 立即返回如果這些 list 都為空, 此時就需要阻塞等待, 等待其他客戶端往這些 list 中插入元素了
  • 單位是 秒(Redis 6, 超時時間允許設定成小數.Redis 5 中,超時時間,得是整數)
命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:取出的元素或者 nil。
?例:
redis> EXISTS list1 list2
(integer) 0
redis> RPUSH list1 a b c
(integer) 3
redis> BLPOP list1 list2 0
1) "list1"
2) "a"
當插入任何一個元素都會返回

3.2 BRPOP

RPOP 的阻塞版本。
語法:
BRPOP key [key ...] timeout
命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:取出的元素或者 nil。
?例:
redis> DEL list1 list2
(integer) 0
redis> RPUSH list1 a b c
(integer) 3
redis> BRPOP list1 list2 0
1) "list1"
2) "c"

4.命令小節?

操作類型命令時間復雜度
添加rpush key value [value ...]O(k),k 是元素個數
lpush key value [value ...]O(k),k 是元素個數
linsert key before | after pivot valueO(n),n 是 pivot 距離頭尾的距離
查找lrange key start end
O(s+n),s 是 start 偏移量,n 是 start 到 end 的范圍
lindex key indexO(n),n 是索引的偏移量
llen keyO(1)
刪除lpop keyO(1)
rpop keyO(1)
lremkey count valueO(k),k 是元素個數
ltrim key start endO(k),k 是元素個數
修改lset key index valueO(n),n 是索引的偏移量
阻塞操作blpop brpopO(1)

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

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

相關文章

js簡單綜合案例之簡易ATM取款機、渲染表格案例、封裝時間函數

這里寫目錄標題 簡易ATM取款機要求代碼實現 渲染表格案例要求代碼實現 封裝時間函數要求代碼實現 簡易ATM取款機 要求 1.彈出彈窗&#xff0c;讓用戶輸入數字選擇操作 2.初始值金額為100&#xff0c;計算每次操作后的剩余金額變化 3.一直彈出彈窗直到用戶輸入4&#xff0c;跳…

OpenCV SIFT特征描述子(GPU版本)

文章目錄 一、簡介二、測試過程三、實現效果參考資料一、簡介 這里主要測試一下SIFT圖像描述子的GPU版本。SIFT圖像描述子,全稱Scale-Invariant Feature Transform(尺度不變特征變換),是計算機視覺和圖像處理領域中一種非常重要的局部特征描述子。它主要用于圖像的特征點檢…

新聞稿海外媒體投稿,除了美聯社發稿(AP)和彭博社宣發(Bloomberg),還有哪些優質的國外媒體平臺可以選擇

發布高質量的新聞稿到海外媒體&#xff0c;除了美聯社發稿&#xff08;AP&#xff09;和彭博社發稿&#xff08;Bloomberg&#xff09;&#xff0c;還有許多其他優質的媒體平臺可以選擇。以下是一些受歡迎和高效的海外媒體發布平臺&#xff1a; 路透社 (Reuters) 路透社是全球最…

Webpack Bundle Analyzer:深入分析與優化你的包

Webpack Bundle Analyzer是一個用于可視化的工具&#xff0c;它可以幫助你分析Webpack打包后的輸出文件&#xff0c;查看哪些模塊占用了最多的空間&#xff0c;從而進行優化。 2500G計算機入門到高級架構師開發資料超級大禮包免費送&#xff01; 首先&#xff0c;你需要安裝W…

IIC通信(STM32)

一、IIC概念 &#xff11;、兩根通信線&#xff1a;SCL&#xff08;Serial Clock&#xff09;、SDA&#xff08;Serial Data&#xff09; 同步&#xff0c;半雙工 2、帶數據應答 3、支持總線掛載多設備&#xff08;一主多從、多主多從&#xff09;一般使用一主多從。一主多從的…

【深度學習】paddlets,時序數據預測

文章目錄 一、環境二、題目1三、題目2四、題目3五、函數參數 資料&#xff1a; https://paddlets.readthedocs.io/zh-cn/latest/source/api/paddlets.models.base.html#paddlets.models.base.BaseModel.recursive_predict https://aistudio.baidu.com/projectdetail/5866171?…

陪跑真正值錢的不是教程,是你遇到那個擋住你的問題時,身邊有個靠譜的人

今天分享兩個概念&#xff0c;一個是意識決定一切&#xff0c;一個是大道至簡&#xff0c;做項目就是按部就班的遵循事情發展規律去做。 先說第一個概念&#xff0c;意識決定一切。我們說的凡事預則立不預則廢&#xff0c;就是計劃了去做就會有結果。 給你們一個表&#xff0c;…

Linux簡單通過Minicom命令操作串口設備(linux串口操作命令)

Minicom是一個在Linux系統中廣泛使用的串行通信程序。它類似于Windows下的超級終端,允許用戶通過串口與外部硬件設備進行通信。Minicom不僅功能強大,而且完全免費,帶有源代碼,可以在大多數Unix系統下運行。 安裝Minicom 在大多數Linux發行版中,Minicom可能沒有預裝。可以…

【前端】面試八股文——BFC

面試八股文——BFC 在前端開發的面試中&#xff0c;BFC&#xff08;Block Formatting Context&#xff0c;塊級格式化上下文&#xff09;常常是一個高頻出現的考點。它不僅考察應聘者對CSS布局的理解深度&#xff0c;也是面試官判斷候選人解決實際問題能力的重要依據之一。因此…

python接口自動化測試中為什么用yaml文件進行用例管理而不是json文件

在Python接口自動化測試中&#xff0c;使用YAML文件進行用例管理而不是JSON文件&#xff0c;主要基于以下幾個原因&#xff1a; 可讀性&#xff1a;YAML文件使用縮進和冒號來表示層級結構&#xff0c;使得文件內容更加清晰易讀。相比之下&#xff0c;JSON文件則使用大括號和中…

MySQL——索引與事務

目錄 前言 一、索引 1.索引概述 &#xff08;1&#xff09;基本概念 &#xff08;2&#xff09;索引作用 &#xff08;3&#xff09;索引特點 &#xff08;4&#xff09;適用場景 2.索引的操作 &#xff08;1&#xff09;查看索引 &#xff08;2&#xff09;創建索引…

LeetCode399觸發求值

題目描述 給你一個變量對數組 equations 和一個實數值數組 values 作為已知條件&#xff0c;其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每個 Ai 或 Bi 是一個表示單個變量的字符串。另有一些以數組 queries 表示的問題&#xff0c;其中 que…

文科論文,使用AI寫作時能夠提供實證數據嗎?

人工智能時代&#xff0c;為了撰寫論文提供思路及高效&#xff0c;利用AI撰寫論文已是常態&#xff0c;可撰寫文科論文通常研究中都需要實證數據&#xff0c;而AI撰寫論文時能夠提供這樣的數據嗎&#xff1f; 一、什么是實證數據 實證數據是指從研究報告、財務報表、新聞報道…

計算機網絡——TCP 協議的三次握手 / 四次揮手

簡述 TCP / UDP 協議都是傳輸層的協議。 UDP 是面向無連接的協議&#xff0c;就是說發送端不在乎消息數據是否傳輸到接收端了&#xff0c;所以會出現數據丟失的情況&#xff0c;所以可靠性也不高。 TCP 是面向連接的、可靠的、基于字節流的傳輸層協議。所謂面向連接的&#…

Flink-cdc更好的流式數據集成工具

What’s Flink-cdc? Flink CDC 是基于Apache Flink的一種數據變更捕獲技術&#xff0c;用于從數據源&#xff08;如數據庫&#xff09;中捕獲和處理數據的變更事件。CDC技術允許實時地捕獲數據庫中的增、刪、改操作&#xff0c;將這些變更事件轉化為流式數據&#xff0c;并能夠…

Windows平臺C#版RTSP轉RTMP直播推送定制版

技術背景 前幾年我們發布了C版的多路RTMP/RTSP轉RTMP轉發官方定制版。在秉承低延遲、靈活穩定、低資源占用的前提下&#xff0c;客戶無需關注開發細節&#xff0c;只需圖形化配置轉發等各類參數&#xff0c;實現產品快速上線目的。 如監控類攝像機、NVR等&#xff0c;通過廠商…

【啟程Golang之旅】深入解析函數的奧秘與技巧

歡迎來到Golang的世界&#xff01;在當今快節奏的軟件開發領域&#xff0c;選擇一種高效、簡潔的編程語言至關重要。而在這方面&#xff0c;Golang&#xff08;又稱Go&#xff09;無疑是一個備受矚目的選擇。在本文中&#xff0c;帶領您探索Golang的世界&#xff0c;一步步地了…

【全開源】海報在線制作系統源碼(ThinkPHP+FastAdmin+UniApp)

打造個性化創意海報的利器 引言 在數字化時代&#xff0c;海報作為一種重要的宣傳媒介&#xff0c;其設計質量和效率直接影響著宣傳效果。為了滿足廣大用戶對于個性化、高效制作海報的需求&#xff0c;海報在線制作系統源碼應運而生。本文將詳細介紹海報在線制作系統源碼的特…

AbMole - 腫瘤發展與免疫器官的“舞蹈”:一場細胞層面的時間賽跑

在生物醫學領域&#xff0c;腫瘤與免疫系統之間的相互作用一直是研究的熱點話題。腫瘤細胞不是孤立存在的&#xff0c;它們與宿主的免疫系統進行著一場復雜的“舞蹈”。 最近&#xff0c;一項發表在《Molecular & Cellular Proteomics》雜志上的研究&#xff0c;為我們揭開…

【C++】二分查找算法

1.題目 2.算法思路 暴力解法&#xff1a;可以將數組遍歷一遍&#xff0c;就可以找到。時間復雜度為O(n)。不算太差&#xff0c;可以接受。 但是有更優秀的解法&#xff1a; 就是二分查找算法。 算法的特點&#xff1a;我們所查找的“數組”具有二段性。這里的二段性不一定有…