「進擊Redis」六、Redis List運用場景、API解析

qsswerwfbh發表於2020-12-08

不懂就問

靈魂拷問之 ☞光頭洗頭用洗面奶還是洗髮水?
好哥哥們把腦洞留在評論區吧。

概述

列表(list)型別是用來儲存多個有序的字串,如下圖,三個元素從左到右組成了一個有序的列表,列表中的每個字串稱為元素(element),一個列表最多可以儲存 2 的 32 次方減 1 個元素。好哥哥們看這圖很像什麼呢,是不是類似於 JAVA 中的 LinkedList(怎麼又是 JAVA)。
在 Redis 中,可以對列表兩端插入(push)和彈出(pop),還可以獲取指定範圍的元素列表、獲取指定索引下標的元素等。列表是一種比較靈活的資料結構,它可以充當棧和佇列的角色,在實際開發上有很多應用場景。
list

1 命令

主要圍繞下面五個操作來說,好哥哥們,看圖:
命令

1.1 新增操作

 ## 從右邊插入元素(right)
 rpush key value [value ...]
 ## 下面程式碼從右向左插入元素
 rpush city:guangdong guangzhou chaoshan shenzhen
 ## 從左邊插入元素(left)
 lpush key value [value ...]
 ## 下面程式碼從左向右插入元素
 rpush city:guangdong shenzhen chaoshan guangzhou
 ## 向某個元素前或者後插入元素, linsert命令會從列表中找到等於(pivot)的元素,在其前(before)或者後(after)插入一個新的元素(value)
 linsert key before|after pivot value
 ## 在潮汕前插入一個元素zhongshan,返回的是列表長度
 linsert city:guangdong before chaoshan zhongshan

1.2 查詢

 ## 獲取指定範圍內的元素列表。索引下標從左到右分別是0到N-1,但是從右到左分別是-1到-N。lrange中的end選項包含了自身,這個和很多程式語言不包含end不太相同。
 lrange key start end
 ## 返回的就是從1到包含3的列表,zhongshan chaoshan guangzhou
 lrange city:guangdong 1 3
 ## 獲取列表指定索引下標的元素
 lindex key index
 ## 獲取city:guangdong索引為1的元素 guangzhou
 lindex city:guangdong 1
 ## 獲取列表長度
 llen key
 ## 獲取city:guangdong的長度,返回4
 llen city:guangdong

1.3 刪除

 ## 從列表左側彈出元素
 lpop key
 ## 從左側刪除一個元素
 lpop city:guangdong
 ## 從列表右側彈出
 rpop key
  ## 從右側刪除一個元素
 rpop city:guangdong
 ## 刪除指定元素。從列表中找到等於value的元素進行刪除。
 ## 如果count>0,從左到右,刪除最多count個元素。如果count=0,刪除所有。
 ## 如果count<0,從右到左,刪除最多count絕對值個元素。
 lrem key count value
 ## 比如我們的列表為a a a guangzhou zhongshan chaoshan guangzhou,執行下面命令結果為guangzhou zhongshan chaoshan guangzhou
 lrem city:guangdong 3 a
 ## 按照索引範圍修剪列表,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
 ltrim key start end
 ## 下面操作會只保留列表city:guangdong第2個到第4個元素
 ltrim city:guangdong 1 3

1.4 修改

 ## 修改指定索引下標的元素
 lset key index newValue
 ## 將第一個元素修改為beijing
 lset city:guangdong 0 beijing

1.5 阻塞操作

 ## 阻塞式彈出,blpop和brpop是lpop和rpop的阻塞版本
 ## key[key...]:多個列表的鍵,timeout:阻塞時間(單位:秒)
 ## 注意點一、如果是多個鍵,那麼brpop會從左至右遍歷鍵,一旦有一個鍵能彈出元素,客戶端立即返回
 ## 注意點二、如果多個客戶端對同一個鍵執行brpop,那麼最先執行brpop命令的客戶端可以獲取到彈出的值。
 blpop key [key ...] timeout
 brpop key [key ...] timeout
 ## 如果裡裡列表中沒有元素,阻塞三秒後返回,如果設定為0,則會一直阻塞,如果此期間新增了資料element1,客戶端立即返回。
 ## 列表不為空:客戶端會立即返回
 brpop city:guangdong 3

2 時間複雜度

老規矩,看圖不說話
複雜度

3 使用場景

  1. 訊息佇列,通過 lpush+brpop 命令組合即可實現阻塞佇列。正常是不會這麼玩的。
  2. 最新列表,List 型別的 lpush 命令和 lrange 命令能實現最新列表的功能,每次通過 lpush 命令往列表裡插入新的元素,然後通過 lrange 命令讀取最新的元素列表,如朋友圈的點贊列表、評論列表。
  3. 排行榜, List 型別的 lrange 命令可以分頁檢視佇列中的資料, 但是隻有定時計算的排行榜才適合使用 list 型別儲存(實時不行)。

本期就到這啦,有不對的地方歡迎好哥哥們評論區留言,另外 求 關 注 、 求 點 贊 \color{#FF0000}{求關注、求點贊}

下一篇:Redis Set 運用場景、API 解析
上一篇:Redis Hash 運用場景、API 解析

相關文章