Redis的列表資料型別

2021-08-27 22:28:50 字數 2993 閱讀 8033

[size=medium][color=blue][list]

[*]list 型別概述

[*]list 的命令操作

[*]list 資料型別應用案例

[/list][/color][/size]

[size=medium][color=olive][b]list 型別概述 — list 的基本概念[/b][/color][/size]

list是乙個鍊錶結構,主要功能是push、pop、獲取乙個範圍的所有值等等,操作中key理解為鍊錶的名字。redis的list型別其實就是乙個每個子元素都是string型別的雙向鍊錶。我們可以通過push、pop操作從鍊錶的頭部或者尾部新增刪除元素, push和pop命令的演算法時間複雜度都是o(1),這樣list既可以作為棧,又可以作為佇列。鍊錶的最大長度是232-1。

[size=medium][color=olive][b]list 型別概述 — 底層實現[/b][/color][/size]

redis列表使用兩種資料結構作為底層實現:

1. 雙端鍊錶

[img]

2. 壓縮列表

因為雙端鍊錶占用的記憶體比壓縮列表要多,所以當建立新的列表鍵時,列表會優

先考慮使用壓縮列表作為底層實現,並且在有需要的時候,才從壓縮列表實現轉

換到雙端鍊錶實現。

[img]

偽**:

列表:

typedef struct list list;

// listnode是雙端鍊錶的節點

typedef struct listnode listnode;

[size=medium][color=olive][b]list 型別概述 — 使用場景[/b][/color][/size]

redis list應用場景非常多,比如:

[list]

[*]微博的關注列表

[*]粉絲列表

[*]訊息佇列

[*]取最新 n 個資料的操作

[*]排行榜應用,取 top n 操作

[/list]

[size=medium][color=olive][b]list 的常用命令[/b][/color][/size]

lpush

語法:lpush key value

解釋:用來向列表左邊增加元素,返回值表示增加元素後列表的長度;lpush命令還支援同時增加多個元素。

lrange

語法:lrange key start end

解釋:用來獲得列表中的某一片段,返回索引從 start 到 end 之間的所有元素,索引從0開始。lrange 命令也支援負索引,-1表示最右邊的元素,-2表示最右邊倒數第2個元素。

rpush

語法:rpush key value

解釋:用來向列表右邊增加元素,返回值表示增加元素後列表的長度;rpush命令還支援同時增加多個元素。

linsert

語法:linsert key before | after pivot value

解釋:此命令首先會在列表中從左到右查詢值為pivot的元素,然後根據第2個引數是before還是after來決定將value插入到前面還是後面。返回值是插入後元素的個數。

lpop/rpop

語法:lpop/rpop key

解釋:lpop命令可以從列表左邊彈出乙個元素;rpop從列表右邊彈出乙個元素。

lpop和lpush配合,rpop和rpush配合可以把列表當作棧使用;lpush和rpop配合,rpush和lpop配合可以把列表當作佇列使用。

lrem

語法:lrem key count value

解釋:lrem 命令會刪除列表中前 count 個值為value 的元素,返回值是實際刪除的元素的個數。

當 count >0時,從左邊開始刪除;

當 count <0時,從右邊開始刪除;

當 count =0時,刪除所有值為 value 的元素;

ltrim

語法:ltrim key start end

解釋:ltrim 命令會刪除列表中指定索引範圍外的所有元素,返回值即指定索引內的元素。ltrim 命令常和 lpush命令一起使用來限制列表中元素的數量,比如記錄日誌時我們希望只保留最近的100條記錄,則每次新增日誌時呼叫一次 ltrim 命令即可。

rpoplpush

語法:rpoplpush src dest

解釋:rpoplpush 命令先從 src 列表的右邊彈出乙個元素,然後將其加入 dest 列表的左邊,並返回這個元素的值。當把列表當作佇列時,rpoplpush 可以在多個佇列中傳遞資料。當 src 與dest 相同時,此命令會不斷的將隊尾的元素移動到隊首。

lindex

語法:lindex key index

解釋:lindex 命令用來返回指定索引的元素,索引從0開始。

lset

語法:lset key index value

解釋:將索引為 index 的元素賦值為 value。

lset

語法:lset key index value

解釋:將索引為 index 的元素賦值為 value。

[size=medium][color=olive][b]list 資料型別應用案例[/b][/color][/size]

[list]

[*]string 型別儲存文章 id

[*]list 型別儲存文章 id

[/list]

[color=blue][b]如何獲取文章列表[/b][/color]

讀取 post:count 鍵獲得部落格文章的最大 id

根據 id 進行分頁(假設每頁10條),第 n 頁的文章 id 範圍是「最大的文章id-(n-1)*10」到「max(最大的文章 id – n*10+1,1)」

[size=medium][color=olive][b]list 型別儲存文章 id[/b][/color][/size]

說明:案例摘抄自極客學院,感謝大牛的分享。

redis 列表 資料型別

列表 rpush dname 技術部 後勤部 售後部 lpush dname 秘書部 lset dname 2 銷售部 修改 lrange dname 0 1 列印所有列表 llen dname 獲取長度 lindex dname 0 獲取列表某個元素 linsert 在某個位置插入元素 linse...

Redis資料型別 List列表型別

介紹 列表型別 list 可以儲存乙個有序的字串列表,常用的操作時向列表兩端新增元素,或者或者列表的某乙個片段。列表型別內部是使用雙向鍊錶實現的。所以向列表兩端新增元素的時間複雜度為o 1 獲取越接近兩端的元素速度就越快。不過使用鍊錶的代價是通過索引訪問元素比較慢,列表也適合用來記錄日誌,可以保證加...

redis 資料型別之列表

1 lpush lpush name,values 在name對應的list中新增元素,每個新的元素都新增到列表的最左邊 如 conn.lpush oo 11,22,33 儲存順序為 33,22,11 擴充套件 rpush name,values 表示從右向左操作 2 lpushx lpushx n...