1. 程式人生 > 資料庫 >redis 物件 列表(list)

redis 物件 列表(list)



1. 列表(list)

列表是簡單的字串列表,列表中的每個字串稱為元素 (element),每個元素是有序可重複的。在 redis 中,可以對列表兩端插入(push)和彈出(pop),還可以獲取指定範圍的元素列表、獲取指定索引下標的元素等。列表是一種比較靈活的資料結構,它可以充當棧和佇列的角色。

image


2. 內部實現

在Redis3.2版本以前列表型別的內部編碼有兩種。

  1. ziplist(壓縮列表):當列表的元素個數小於list-max-ziplist-entries配置(預設512個),同時列表中每個元素的值都小於list-max-ziplist-value配置時(預設64位元組),Redis會選用ziplist來作為列表的內部實現來減少記憶體的使用。
  2. linkedlist(連結串列):當列表型別無法滿足ziplist的條件時,Redis會使用linkedlist作為列表的內部實現。

而在Redis3.2版本開始對列表資料結構進行了改造,使用 quicklist 代替了 ziplist 和 linkedlist.


2. 常用命令

命令 描述
移出,並獲取第一個元素,會阻塞列表,直到有元素為止。
移出,並獲取最後一個元素,會阻塞列表,直到有元素為止。
彈出一個值,將插入另外一個列表中並返回它,會阻塞列表,直到有元素為止
通過索引獲取列表中的元素
在列表的元素前或者後插入元素
獲取列表長度
移出,並獲取第一個元素
將一個或者多個插入列表頭部
將一個值插入到已存在的列表頭部
獲取指定範圍內的元素
移除列表元素
通過索引設定列表元素的值
修剪到指定範圍內的清單
從佇列右邊移除一個元素,並返回
移除列表的最後一個元素,並將該元素新增到另一個列表並返回
從列表右邊新增一個或多個元素
從列表右邊新增一個或多個元素,僅佇列存在時有效

3. 使用場景

  1. 訊息佇列 (lpush + brpop)

    列表型別可以使用 rpush 實現先進先出的功能,同時又可以使用 lpop 輕鬆的彈出(查詢並刪除)第一個元素,所以列表型別可以用來實現訊息佇列

    image

  2. 排行榜(lrange + rpush)

    lrange命令可以分頁檢視佇列中的資料。可將每隔一段時間計算一次的排行榜儲存在list型別中。如銷量,成績,打榜排行

    但是,並不是所有的排行榜都能用list型別實現,只有定時計算的排行榜才適合使用list型別,有序集合支援實時計算的排行榜

  3. 最新列表(lrange + lpush)

    lpush 和 lrange 能實現最新列表的功能,每次通過lpush命令往列表裡插入新的元素,然後通過lrange命令讀取最新的元素列表,如朋友圈的點贊列表、評論列表。

    不需要按時範圍查詢,並且不需要分頁,或者更新頻率低