Redis基本資料結構之List

2022-03-29 18:18:58 字數 3322 閱讀 8259

列表(list)型別是用來儲存多個有序字串。在 redis 中,可以對列表的兩端進行插入(push)和彈出(pop)操作,還可以獲取指定範圍元素列表、獲取指定索引下標元素等。

列表是一種比較靈活資料結構,它可以充當佇列的角色,在實際開發上有很多應用場景。

如圖所示,a、b、c、d、e 五個元素從左到右組成了乙個有序的列表,列表中的每個字串稱為元素(element),乙個列表最多可以儲存 2 ^ 32 - 1 個元素。

從右邊插入元素

命令為:rpush key value [value ...]

(1) 從左邊插入元素

命令為:lpush key value [value ...]

使用方法和 rpush 相同,只不過從左側插入

(2) 向某個元素前或者後插入

命令為:linsert key before|after pivot value

linsert 命令會從 列表 中找到第乙個 等於 pivot 的元素,在其 前(before)或者 後(after)插入乙個新的元素 value,例如下面操作會在列表的 元素 b 前插入 redis:

返回的結果代表列表的長度

(3) 獲取列表指定索引下標的元素

命令為:lindex key index

(4) 獲取列表長度

命令為:llen key

(5) 從左側或右側彈出元素

從左側彈出命令為:lpop key

從右側彈出命令為:rpop key

(6) 刪除指定元素

命令為:lrem key count value

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

例如向列表從左向右插入 5 個 a,那麼當前列表變為 「a a a a a redis b 」,下面操作將從列表左邊開始刪除 4 個為 a 的元素:

(7) 按照索引列表修剪列表

命令為:ltrim key start stop

(8) 阻塞彈出命令

向左阻塞彈出命令:blpop key [key ...] timeout

向右阻塞彈出命令:brpop key [key ...] timeout

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,它們除了彈出方向不同,使用方法基本相同,所以下面以 brpop 命令進行說明, brpop 命令包含兩個引數:

對於 timeout 引數,要氛圍列表為空不為空兩種情況:

l列表為空

如果 timeout = 3,那麼客戶端要等到 3 秒後返回,如果 timeout = 0,那麼客戶端一直阻塞等下去,如果在此期間新增了資料,客戶端會立即返回

l列表不為空

客戶端會 立即返回。

(9) 命令時間複雜度

訊息佇列

通過 redis 的 lpush + brpop 命令組合,即可實現阻塞佇列。如圖所示:

生產者客戶端 使用 lrpush 從列表 左側插入元素,多個消費者客戶端使用 brpop 命令阻塞式的「搶」列表 尾部 的元素,多個客戶端保證了消費的負載均衡高可用性

(10) 其他場景

命令組合

對應資料結構

lpush + lpop

stack(棧)

lpush + rpop

queue(佇列)

Redis redis基本資料結構之List

redis中的list資料結構是鏈表型的,類似於linkedlist。所以它的插入效率非常高,時間複雜度為o 1 它的查詢效率較慢,時o n 但其實redis內部,list結構又不是乙個簡單的鍊錶,因為linkedlist的每乙個節點都要儲存上乙個節點和下乙個節點的指標,相對來說比陣列型的列表更佔空...

redis基本資料結構之ZSet

zset資料結構類似於set結構,只是zset結構中,每個元素都會有乙個分值,然後所有元素按照分值的大小進行排列,相當於是乙個進行了排序的鍊錶。如果zset是乙個鍊錶,而且內部元素是有序的,在進行元素插入和刪除,以及查詢的時候,就必須要遍歷鍊錶才行,時間複雜度就達到了o n 這個在以單執行緒處理的r...

Redis基本資料結構之ZSet

zset保留了集合不能有重複成員的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下標作為排序依據不同的是,它給每個元素設定乙個分數 score 作為排序的依據。有序集合中的元素不能重複,但是score可以重複,就和乙個班裡的同學學號不能重複,但是考試成績可以相同。新增元素 命令為 ...