[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...