列表(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可以重複,就和乙個班裡的同學學號不能重複,但是考試成績可以相同。新增元素 命令為 ...