文章目錄
- 🍃前言
- 🍀常見操作命令介紹
- 🚩lpush
- 🚩lpushx
- 🚩rpush
- 🚩rpushx
- 🚩lrange
- 🚩lpop
- 🚩rpop
- 🚩lindex
- 🚩linsert
- 🚩llen
- 🚩lrem
- 🚩ltrim
- 🚩lset
- 🌴阻塞版命令介紹
- 🎄列表型的內部編碼
- 🎋使用場景
- 🚩消息隊列
- ?總結
🍃前言
列表類型是?來存儲多個有序的字符串,列表中的每個字符串稱為元素(element),?個列表最多可以存儲 2的32次方-1 個元素。
在 Redis 中,可以對列表兩端插?(push)和彈出(pop),還可以獲取指定范圍的元素列表、獲取指定索引下標的元素等。
列表是?種?較靈活的數據結構,它可以充當棧和隊列的??,在實際開發上有很多應?場景。
列表類型有以下特點:
-
第?、列表中的元素是有序的,這意味著可以通過索引下標獲取某個元素或者某個范圍的元素列表
-
第?、區分獲取和刪除的區別,獲取與刪除都會獲得對應下標的值,但是刪除會改變列表長度
-
第三、列表中的元素是允許重復的
對列表類型有了一個基本的了解后,接下來我們來看看Redis中如何操作列表類型以及列表類型的內部編碼與使用場景
🍀常見操作命令介紹
🚩lpush
將?個或者多個元素從左側放?(頭插)到 list 中。
語法:
lpush key element [element ...]
時間復雜度:
- 只插??個元素為O(1),插?多個元素為O(N), N 為插?元素個數.
返回值:
- 插?后 list 的?度
🚩lpushx
在 key 存在時,將?個或者多個元素從左側放?(頭插)到 list 中。不存在,直接返回
語法:
lpushx key element [element ...]
時間復雜度:
- 只插??個元素為O(1),插?多個元素為O(N),N為插?元素個數.
返回值:
- 插?后 list 的?度。
🚩rpush
將?個或者多個元素從右側放?(尾插)到 list 中
語法:
rpush key element [element ...]
時間復雜度:
- 只插??個元素為 O(1),插?多個元素為 O(N), N 為插?元素個數.
返回值:
- 插?后 list 的?度。
🚩rpushx
在 key 存在時,將?個或者多個元素從右側放?(尾插)到 list 中。
語法:
rpushx key element [element ...]
時間復雜度:
- 只插??個元素為 O(1), 插?多個元素為 O(N), N 為插?元素個數.
返回值:
- 插?后 list 的?度。
🚩lrange
獲取從 start 到 end 區間的所有元素,左閉右閉。
語法:
lrange key start stop
時間復雜度:
- O(N)
返回值:
- 指定區間的元素
🚩lpop
從 list 左側取出元素(即頭刪)
語法:
lpop key
時間復雜度:
- O(1)
返回值:
- 取出的元素或者nil。
🚩rpop
從 list 右側取出元素(即尾刪)。
語法:
rpop key
時間復雜度:
- O(1)
返回值:
- 取出的元素或者 nil
🚩lindex
獲取從左數第 index 位置的元素
語法:
lindex key index
時間復雜度:
- O(N)
返回值:
- 取出的元素或者nil。
🚩linsert
在特定位置插入元素
語法:
linsert key <BEFORE | AFTER> pivot element
時間復雜度:
- O(N)
返回值:
- 插?后的 list ?度
🚩llen
獲取 list 的長度
語法:
llen key
時間復雜度:
- O(1)
返回值:
- list的?度。
🚩lrem
從左往右刪除指定個數(count)的 value
語法:
lrem key count value
時間復雜度
- O(k),k為list所存在value與count中的最小值
返回值:
- 返回刪除list的長度
🚩ltrim
刪除除指定字段外的所有值
語法:
ltrim key start end
時間復雜度:
- O(k),k為所刪除list的長度
返回值:
- ok
🚩lset
修改指定位置的值
語法:
lset key index value
時間復雜度:
- O(1)
返回值:
- ok
🌴阻塞版命令介紹
blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和對應?阻塞版本的作?基本?致,除了:
- 在列表中有元素的情況下,阻塞和?阻塞表現是?致的。但如果列表中沒有元素,?阻塞版本會理解返回 nil,但阻塞版本會根據 timeout,阻塞?段時間,期間 Redis 可以執?其他命令,但要求執?該命令的客?端會表現為阻塞狀態。
- 命令中如果設置了多個鍵,那么會從左向右進?遍歷鍵,?旦有?個鍵對應的列表中可以彈出元素,命令?即返回。
- 如果多個客?端同時多?個鍵執? pop,則最先執?命令的客?端會得到彈出的元素。
接下來演示以下用法:
首先準備兩個客戶端
客戶端1 準備一個列表數據如下
然后客戶端2 使用阻塞版命令進行獲取
獲取玩列表元素后,再次進行獲取:
首先使用非阻塞版本的 rpop 進行獲取
其次使用阻塞版本的 brpop 進行獲取,出現阻塞
接下來,使用客戶端一,向隊列添加元素:
我們就可以看到阻塞版命令與普通命令的差別了
🎄列表型的內部編碼
列表類型的內部編碼有兩種:
-
ziplist(壓縮列表):當列表的元素個數?于 list-max-ziplist-entries 配置(默認 512 個),同時列表中每個元素的?度都?于 list-max-ziplist-value 配置(默認 64 字節)時,Redis會選? ziplist 來作為列表的內部編碼實現來減少內存消耗。
-
linkedlist(鏈表):當列表類型?法滿? ziplist 的條件時,Redis 會使? linkedlist 作為列表的內部實現
🎋使用場景
🚩消息隊列
Redis 可以使? lpush + brpop 命令組合實現經典的阻塞式?產者-消費者模型隊列,?產者客?端使? lpush 從列表左側插?元素,多個消費者客?端使? brpop 命令阻塞式地從隊列中"爭搶" 隊?元素,通過多個客?端來保證消費的負載均衡和?可?性。
而且還可以通過用不同的鍵模擬頻道的概念,不同的消費者可以通過brpop不同的鍵值,實現訂閱不同頻道的理念。
?總結
關于《【Redis】 關于列表類型》就講解到這兒,感謝大家的支持,歡迎各位留言交流以及批評指正,如果文章對您有幫助或者覺得作者寫的還不錯可以點一下關注,點贊,收藏支持一下