Redis:10---List對象


一、列表對象概述

? ? ? 列表類型是用來存儲多個有序的字符串,一個列表最多可以存儲多個元素。列表是一種比較靈活的數據結構,它可以充當棧和隊列的角色,在實際開發上有很多應用場景

  • 特點:

    • 一個列表可以存儲多個字符串,相同元素可以重復出現

    • 列表中的元素是有序的,根據元素的插入、刪除順序對元素進行排序

  • 優點:可以包含多個字符串值,使得用戶可以將數據集中在同一個地方。

二、命令

常用命令?

命令用例和描述
RPUSHRPUSH? key-namevaluelvalue...]-將一個或多個值推入列表的右端
LPUSHLPUSH? key-nanevalue[value...]-將一個或多個值推入列衷的左蹦
RPOPRPOP? key-name- 移除并返回剛農聶石瑞的元素
LPOPLPOP? ?key-name- 移除并返回列農最左瑞印元素
LINDEXLINDEX? key-nameoffset--返回列表中偏移量為offset的元素
LRANGELRANGE key-name start? end-返回列表從start偏移量到end偏移量范圍內的所有元素.
其中偏移量為start和偏移量為end的元素也會包否在被返回的元素之內
LTRIMLTRIM key-name start end-對列表進行修剪,只保留從start偏移量到end偏移量范圍
內的元素,其中俯移量為start和偏移量為end的元景也會被床出

linsert

linsert命令會從列表中找到等于pivot的元素,在其前(before)或者后 (after)插入一個新的元素value

linsert key before|after pivot value
  • 例如下面操作會在列表的元素a前插入C++:

llen

  • 獲取列表長度

llen key

  • lrem:刪除指定元素。lrem命令會從列表中找到等于value的元素進行刪除,根據count的不同分為三種情況:

    • count>0,從左到右,刪除最多count個元素

    • count<0,從右到左,刪除最多count絕對值個元素

    • count=0,刪除所有

lrem key count value

?

  • lset:修改指定索引下標的元素

lset key index newValue

?

  • lrange注意事項:

    • 第一,索引下標從左到右分別是0到N-1,但是從右到左分別是-1到-N

    • ?第二,lrange中的end選項包含了自身,這個和很多編程語言不包含end不太相同

  • 其他演示案例:

  • 接上

  • 接上

其他命令

命令用例和描述
BLPOP

BLPOP key-name [key-name?...]timeout———從第一個非空列表中彈出位升最左端 1元素,
或者在timeout秒之內阻塞并等待 可彈出的元素出現

BRPOPBRPOP key-name [key-name ...]timeout—從第一個非空列表中彈出位扌最右端的 元素,
或者在timeout秒之內阻塞并等待中彈出的元素出現
RPOPLPUSHRPOPLPUSH source-key dest-key 從source-key列表中彈出位于最右端的元素,然后
將這個元素推入dest-key列表的最左端. 并向用戶返回這個元素
BRPOPLPUSHBRPOPLPUSH source-key dest-key timeout——從source-key列表中彈出位于最右端
元素,然后將這個元素推入dest-key列表的最左端,并向用戶返回這個元素,如果source-key
為空,那么在timeout秒之內阻塞并等特可彈出的元素出現
  • 在Redis隊列的場景下,這些命令會非常有用

  • 對于阻塞彈出命令和彈出并推入命令,最常用的就是消息傳遞和任務隊列

BLPOP命令演示案例

  • 先用BLPOP命令阻塞等待new_list鍵中有值出現

  • 在右側客戶端中向new_list中壓入一個元素,可以看到左側返回

BRPOPLPUSH命令演示案例

  • 左側等待source_list中有鍵值可以移動到dest_list中

  • 右側向source_list壓入值,左側看到成功返回

  • 查看source_list中的值,可以看到沒有了(已經移動到dest_list列表中了),右側查看dest_list列表

  • 列表命令的復雜度:

三、內部編碼

  • 列表類型的內部編碼有兩種:

    • ziplist(壓縮列表):當列表的元素個數小于list-max-ziplist-entries配置 (默認512個),同時列表中每個元素的值都小于list-max-ziplist-value配置時 (默認64字節),Redis會選用ziplist來作為列表的內部實現來減少內存的使 用

    • linkedlist(鏈表):當列表類型無法滿足ziplist的條件時,Redis會使用 linkedlist作為列表的內部實現。

  • Redis3.2版本提供了quicklist內部編碼,簡單地說它是以一個ziplist為節點的linkedlist,它結合了ziplist和linkedlist兩者的優勢,為列表類型提供了一 種更為優秀的內部編碼實現.

四、使用場景

①消息隊列

  • 如下圖所示,Redis的lpush+brpop命令組合即可實現阻塞隊列,生產者客戶端使用lrpush從列表左側插入元素,多個消費者客戶端使用brpop命令阻塞式的“搶”列表尾部的元素,多個客戶端保證了消費的負載均衡和高可用性

②文章列表

  • 每個用戶有屬于自己的文章列表,現需要分頁展示文章列表。此時可以考慮使用列表,因為列表不但是有序的,同時支持按照索引范圍獲取元素

  • ①每篇文章使用哈希結構存儲,例如每篇文章有3個屬性title、 timestamp、content:

hmset acticle:1 title xx timestamp 1476536196 content xxxx
...
hmset acticle:k title yy timestamp 1476512536 content yyyy
...
  • ②向用戶文章列表添加文章,user:{id}:articles作為用戶文章列表的鍵:

lpush user:1:acticles article:1 article3
...
lpush user:k:acticles article:5
...
  • ③分頁獲取用戶文章列表,例如下面偽代碼獲取用戶id=1的前10篇文章:

articles = lrange user:1:articles 0 9
for article in {articles}
hgetall {article}
  • 使用列表類型保存和獲取文章列表會存在兩個問題:

    • 第一,如果每次分 頁獲取的文章個數較多,需要執行多次hgetall操作,此時可以考慮使用Pipeline(后面文章有介紹)批量獲取,或者考慮將文章數據序列化為字符串類 型,使用mget批量獲取

    • 第二,分頁獲取文章列表時,lrange命令在列表兩 端性能較好,但是如果列表較大,獲取列表中間范圍的元素性能會變差,此 時可以考慮將列表做二級拆分,或者使用Redis3.2的quicklist內部編碼實現, 它結合ziplist和linkedlist的特點,獲取列表中間范圍的元素時也可以高效完成

  • 實際上列表的使用場景很多,在選擇時可以參考以下口訣:

    • lpush+lpop=Stack(棧)

    • lpush+rpop=Queue(隊列)

    • lpsh+ltrim=Capped Collection(有限集合)

    • lpush+brpop=Message Queue(消息隊列)

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

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

相關文章

Redis:09---Hash對象

一、哈希對象簡介幾乎所有的編程語言都提供了哈希&#xff08;hash&#xff09;類型&#xff0c;它們的叫法可能是哈希、字典、關聯數組哈希又稱散列在Redis中&#xff0c;哈希類型是指鍵值本身又是一個鍵值對結構&#xff0c;形如value{{field1&#xff0c;value1}&#xff0c…

leetcode329. 矩陣中的最長遞增路徑

給定一個整數矩陣&#xff0c;找出最長遞增路徑的長度。 對于每個單元格&#xff0c;你可以往上&#xff0c;下&#xff0c;左&#xff0c;右四個方向移動。 你不能在對角線方向上移動或移動到邊界外&#xff08;即不允許環繞&#xff09;。 示例 1: 輸入: nums [ [9,9,…

Query Ajax 實例 ($.ajax、$.post、$.get)

Jquery在異步提交方面封裝的很好&#xff0c;直接用AJAX非常麻煩&#xff0c;Jquery大大簡化了我們的操作&#xff0c;不用考慮瀏覽器的詫異了。 推薦一篇不錯的jQuery Ajax 實例文章&#xff0c;忘記了可以去看看&#xff0c;地址為&#xff1a;http://www.cnblogs.com/yeer/a…

C++:18---const關鍵字(附常量指針、指針常量、常量指針常量)

一、const變量的一些基本特點 ①const修飾的變量不能被修改const int a=10; a=20;//錯誤②因為const修飾的變量不能被修改,所以必須被初始化int a=10; const int b=a; //正確 const int c=10; //正確③const修飾的變量可以賦值給其他值const int a=10; int b=a;//正確④可以有…

C:01---數據類型與ASCII

一、整型 int 取值范圍:-32768~32767unsigned int 取值范圍:0~65535short /short int 取值范圍:比int小unsigned short 無符號短整型long 長整型定義時,后面加上l或L有符號與無符號數: unsigned:無符號數,一般用來表示數據signed:有符號數,一般用來表示數字整型占…

leetcode330. 按要求補齊數組 頂級難度玄學貪心

給定一個已排序的正整數數組 nums&#xff0c;和一個正整數 n 。從 [1, n] 區間內選取任意個數字補充到 nums 中&#xff0c;使得 [1, n] 區間內的任何數字都可以用 nums 中某幾個數字的和來表示。請輸出滿足上述要求的最少需要補充的數字個數。 示例 1: 輸入: nums [1,3], …

C:02---scanf、printf

一、printf 控制符 ①精度控制:輸入小數點后m位(%.mf)。右對齊5位,保留小數點后m位(%d.mf)%f、%lf默認輸出6位小數②寬度:%md(打印m為,右對齊,多出m位照常打印)。%-md(打印m位,左對齊,多出m位照常打印)③長度:h表示短(打印短整型short:%hd),l表示長(打印長…

C++:20---成員變量初始化方式

成員變量初始化有三種方式: 在構造函數體內賦值初始化在自定義的公有函數體中賦值初始化(一般用于成員變量的初始化)在構造函數的成員初始化列表初始化一、構造函數體內初始化 說明:在構造函數體內的初始化方式,本質是是為成員變量賦值,而不是真正意義上的初始化,這點要…

leetcode339. 嵌套列表權重和

給定一個嵌套的整數列表&#xff0c;請返回該列表按深度加權后所有整數的總和。 每個元素要么是整數&#xff0c;要么是列表。同時&#xff0c;列表中元素同樣也可以是整數或者是另一個列表。 示例 1: 輸入: [[1,1],2,[1,1]] 輸出: 10 解釋: 因為列表中有四個深度為 2 的 1…

C++:19---this指針

一、this指針介紹 概念:this指針是成員函數的一個隱式參數,在類中本質上就是對象的指針(常量指針)特點:在成員函數中可通過this指針區別成員變量與形參變量this可以顯式調用示例代碼:class Cperson{private:int age;float height;public:void InitPerson(int age,float hei…

leetcode346. 數據流中的移動平均值

給定一個整數數據流和一個窗口大小&#xff0c;根據該滑動窗口的大小&#xff0c;計算其所有整數的移動平均值。 示例: MovingAverage m new MovingAverage(3); m.next(1) 1 m.next(10) (1 10) / 2 m.next(3) (1 10 3) / 3 m.next(5) (10 3 5) / 3 思路&#xff1…

(二十)TCPIP面試寶典-進入大廠必備總結(中)

TCP 作為傳輸層的協議,是一個IT工程師素養的體現,也是面試中經常被問到的知識點。在此,我將 TCP 核心的一些問題梳理了一下,希望能幫到各位。 實際上這篇文章相當于是復習之前的網絡基礎部分。只不過這篇文章的提問方式更靈活,也是讓讀者們懂得變通,更熟悉TCP。 前兩篇文…

leetcode263. 丑數

編寫一個程序判斷給定的數是否為丑數。 丑數就是只包含質因數 2, 3, 5 的正整數。 示例 1: 輸入: 6 輸出: true 解釋: 6 2 3 示例 2: 輸入: 8 輸出: true 解釋: 8 2 2 2 示例 3: 輸入: 14 輸出: false 解釋: 14 不是丑數&#xff0c;因為它包含了另外一個質因數 7。…

(二十一)TCPIP面試寶典-進入大廠必備總結(下)

TCP 作為傳輸層的協議,是一個IT工程師素養的體現,也是面試中經常被問到的知識點。在此,我將 TCP 核心的一些問題梳理了一下,希望能幫到各位。 實際上這篇文章相當于是復習之前的網絡基礎部分。只不過這篇文章的提問方式更靈活,也是讓讀者們懂得變通,更熟悉TCP。 上一篇文…

C++:23 再議const的用法(下)

上一篇文章折騰了一波粉絲,那么這一篇文章稍微溫柔一些。 我主要開始說如何正確使用const 1.不能將const 修飾的任何對象、引用和指針作為賦值表達式的左值。 const int cx=100; const int & rcx=cx; const int * pcx=&cx; cx=200; //error rcx=200; //error *pcx=200…

C++:22 再議const的作用(上)

我在C++:18篇里說過const的用法,這里我有必要再提升進階下const的理解。 因為你可能只知道他是怎么用的,但是他為什么這樣用,其他用法呢? 首先回顧下const有什么主要的作用? (1)可以定義const常量,具有不可變性。 (2)便于進行類型檢查,使編譯器對處理內容有更多了解…

leetcode57. 插入區間

給出一個無重疊的 &#xff0c;按照區間起始端點排序的區間列表。 在列表中插入一個新的區間&#xff0c;你需要確保列表中的區間仍然有序且不重疊&#xff08;如果有必要的話&#xff0c;可以合并區間&#xff09;。 示例 1: 輸入: intervals [[1,3],[6,9]], newInterval …

C:03---運算符優先級

二話不說先看運算符的優先級表: 一、逗號運算符 格式:整個逗號表達式的值返回的結果是最后一個表達式的值使用起來,最好加上括號來返回最后一個表達式的值。否則逗號表達式的意義將失效(見下面演示案例)(表達式1, 表達式2, 表達式3....); #include <stdio.h> int ma…

C++: 21---引用和指針

一般說到誰和誰怎么樣,要么說兩者的相似點,要么兩者的區別,這里我們也要說二者的區別和聯系,同時,也不僅僅是區別和聯系這么簡單,因為你可能會發現在變量賦值,函數傳參這兩點還是有很多值得品一品的。 最直觀的賦值方面的區別 首先我們先說二者的區別和聯系。 (1)指針…

Oracle數據庫Date類型查詢問題(

淺談Oracle數據庫Date類型查詢問題用過Oracle數據庫的朋友應該知道&#xff0c;Oracle數據庫在以Date類型為查詢條件時存在一個小小的BUG&#xff0c;如&#xff1a;select * from tableName where createDate > to_date(2007-01-01,yyyy-mm-dd) and createDate < to_dat…