redis之List數據類型以及存儲原理

文章目錄

1.概述

1.存儲有序的字符串(從左到右),元素可以重複。可以充當隊列和棧的角色。

1.1.特點

1.1.1.有順序

1.1.2.可以重複

2.相關命令

2.1.將一個或多個值 value 從左邊插入到列表 key 的表頭:

2.1.1.不管key是否存在,都插入:lpush teacher_name_list tom frank jerry jim lucy lily

127.0.0.1:6379> lpush  teacher_name_list tom frank jerry jim lucy lily
(integer) 6
127.0.0.1:6379> LRANGE teacher_name_list 0 -1
1) "lily"
2) "lucy"
3) "jim"
4) "jerry"
5) "frank"
6) "tom"
127.0.0.1:6379> 

注意下

lpush  teacher_name_list tom frank jerry jim lucy lily
等價於
lpush  teacher_name_list tom;
lpush  teacher_name_list frank;
lpush  teacher_name_list jerry;
lpush  teacher_name_list jim;
lpush  teacher_name_list lucy;
lpush  teacher_name_list lily;

2.1.2.只有key存在時,才插入:lpushx parent liubei

由於key:teachers不存在,所以插入失敗

127.0.0.1:6379> lrange teachers 0 -1
(empty list or set)
127.0.0.1:6379> lpushx teachers gaoxinfu
(integer) 0
127.0.0.1:6379> 

key:parent存在,所以插入成功

127.0.0.1:6379> lrange parent 0 -1
1) "tom"
2) "liran"
3) "gaoxinfu"
127.0.0.1:6379> lpushx parent liubei
(integer) 4
127.0.0.1:6379> 
127.0.0.1:6379> lrange parent 0 -1
1) "liubei"
2) "tom"
3) "liran"
4) "gaoxinfu"
127.0.0.1:6379> 

2.2.返回列表 key 中指定區間內的所有元素:LRANGE teacher_name_list 0 -1

0是第一個,-1是最後一個,1是第一個,-2是倒數第二個

127.0.0.1:6379> LRANGE teacher_name_list 0 -1
1) "lily"
2) "lucy"
3) "jim"
4) "jerry"
5) "frank"
6) "tom"
127.0.0.1:6379> 

2.3.將一個或多個值 value 從右邊插入到列表 key 的表頭:

2.3.1.不管key是否存在,都插入:RPUSH teacher_name_list gaoxinfu zhaobolun

從最後面開始插入數據

127.0.0.1:6379> RPUSH teacher_name_list gaoxinfu zhaobolun
(integer) 8
127.0.0.1:6379> lrange teacher_name_list 0 -1
1) "lily"
2) "lucy"
3) "jim"
4) "jerry"
5) "frank"
6) "tom"
7) "gaoxinfu"
8) "zhaobolun"
127.0.0.1:6379> 

2.3.2.只有當key存在時候,才插入:rpushx parent gaoxinfu

由於key:teachers不存在,所以插入失敗

127.0.0.1:6379> rpushx teachers gaoxinfu
(integer) 0
127.0.0.1:6379> lrange teachers 0 -1
(empty list or set)
127.0.0.1:6379> rpushx teachers gaoxinfu
(integer) 0
127.0.0.1:6379> 

key:parent 存在,所以插入成功

127.0.0.1:6379> rpushx parent gaoxinfu
(integer) 5
127.0.0.1:6379> lrange parent 0 -1
1) "liubei"
2) "tom"
3) "liran"
4) "gaoxinfu"
5) "gaoxinfu"
127.0.0.1:6379> 

2.4.從左邊移除第一個元素:lpop teacher_name_list

127.0.0.1:6379> lrange teacher_name_list 0 -1
1) "lily"
2) "lucy"
3) "jim"
4) "jerry"
5) "frank"
6) "tom"
7) "gaoxinfu"
8) "zhaobolun"
127.0.0.1:6379> lpop teacher_name_list
"lily"
127.0.0.1:6379> 

再次查詢結果如下,lily被移除

127.0.0.1:6379> lrange teacher_name_list 0 -1
1) "lucy"
2) "jim"
3) "jerry"
4) "frank"
5) "tom"
6) "gaoxinfu"
7) "zhaobolun"
127.0.0.1:6379> 

2.5.從右邊移除第一個元素:rpop teacher_name_list

127.0.0.1:6379> lrange teacher_name_list 0 -1
1) "lucy"
2) "jim"
3) "jerry"
4) "frank"
5) "tom"
6) "gaoxinfu"
7) "zhaobolun"
127.0.0.1:6379> rpop teacher_name_list
"zhaobolun"

再次查詢,發現zhaobolun已經被移除

127.0.0.1:6379> lrange teacher_name_list 0 -1
1) "lucy"
2) "jim"
3) "jerry"
4) "frank"
5) "tom"
6) "gaoxinfu"
127.0.0.1:6379> 

2.6.返回指定list下標的value:lindex teacher_name_list 1

第一個下標是0,第二個下標示1

127.0.0.1:6379> lrange teacher_name_list 0 -1
1) "lucy"
2) "jim"
3) "jerry"
4) "frank"
5) "tom"
6) "gaoxinfu"
127.0.0.1:6379> lindex teacher_name_list 1
"jim"
127.0.0.1:6379> lindex teacher_name_list -1
"gaoxinfu"
127.0.0.1:6379> lindex teacher_name_list -3
"frank"
127.0.0.1:6379> 

如果要返回連續的多個,使用lrange

2.7.返回list數組的長度:LLEN teacher_name_list

127.0.0.1:6379> LRANGE teacher_name_list 0 -1
1) "lucy"
2) "jim"
3) "jerry"
4) "frank"
5) "tom"
6) "gaoxinfu"
127.0.0.1:6379> LLEN teacher_name_list
(integer) 6
127.0.0.1:6379> 

2.8.移除list數組中的元素:

格式

LREM key count value;

說明

根據參數 count 的值,移除列表中與參數 value 相等的元素。
count 的值可以是以下幾種:
count > 0 : 從表頭開始向表尾搜索,移除與 value 相等的元素,數量爲 count 。
count < 0 : 從表尾開始向表頭搜索,移除與 value 相等的元素,數量爲 count 的絕對值。
count = 0 : 移除表中所有與 value 相等的值。
返回值
被移除元素的數量。 因爲不存在的 key 被視作空表(empty list),所以當 key 不存在時, LREM 命令總是返回 0
127.0.0.1:6379> lrange teacher_name_list 0 -1
1) "frank"
2) "lucy"
3) "jim"
4) "jerry"
5) "frank"
6) "tom"
7) "gaoxinfu"
8) "jim"

2.8.1. 刪除從最後面數,1個值爲jim的值:lrem teacher_name_list -1 jim

127.0.0.1:6379> lrem teacher_name_list -1 jim
(integer) 1

2.8.2. 刪除從最後面數,2個值爲jim的值,實際上因爲只有一個jim,所以返回刪除個數爲1:lrem teacher_name_list -2 jim

127.0.0.1:6379> lrem teacher_name_list -2 jim
(integer) 1
127.0.0.1:6379> lrange teacher_name_list 0 -1
1) "frank"
2) "lucy"
3) "jerry"
4) "frank"
5) "tom"
6) "gaoxinfu"

2.8.3. 刪除從最後面數,2個值爲frank的值:lrem teacher_name_list -2 frank

127.0.0.1:6379> lrem teacher_name_list -2 frank
(integer) 2
127.0.0.1:6379> 
127.0.0.1:6379> lrange teacher_name_list 0 -1
1) "lucy"
2) "jerry"
3) "tom"
4) "gaoxinfu"

2.8.4. 刪除從最前面數,1個值爲lucy的值:lrem teacher_name_list 1 lucy

127.0.0.1:6379> lrem teacher_name_list 1 lucy
(integer) 1
127.0.0.1:6379> lrange teacher_name_list 0 -1
1) "jerry"
2) "tom"
3) "gaoxinfu"
127.0.0.1:6379> 

2.9.向list數組插入value值

2.9.1.在list數組中某個值之前插入值:linsert teacher_name_list before tom lucy

127.0.0.1:6379> lrange teacher_name_list 0 -1
1) "jerry"
2) "tom"
3) "gaoxinfu"
127.0.0.1:6379> linsert teacher_name_list before tom lucy
(integer) 4
127.0.0.1:6379> lrange teacher_name_list 0 -1
1) "jerry"
2) "lucy"
3) "tom"
4) "gaoxinfu"
127.0.0.1:6379> 

2.9.2.在list數組中某個值之後插入值:linsert teacher_name_list after tom lily

127.0.0.1:6379> lrange teacher_name_list 0 -1
1) "jerry"
2) "lucy"
3) "tom"
4) "gaoxinfu"
127.0.0.1:6379> linsert teacher_name_list after tom lily
(integer) 5
127.0.0.1:6379> 

2.10.將children數組中的最後一個元素放到parent數組的第一個元素:RPOPLPUSH children parent

(integer) 2
127.0.0.1:6379> lrange children 0 -1
1) "lily"
2) "lucy"
3) "tom"
127.0.0.1:6379> lrange parent 0 -1
1) "liran"
2) "gaoxinfu"
127.0.0.1:6379> 
127.0.0.1:6379> RPOPLPUSH children parent
"tom"
127.0.0.1:6379> lrange children 0 -1
1) "lily"
2) "lucy"
127.0.0.1:6379> lrange parent 0 -1
1) "tom"
2) "liran"
3) "gaoxinfu"
127.0.0.1:6379> 

2.11.blpop的使用:http://redisdoc.com/list/blpop.html

2.12.brpop的使用:http://redisdoc.com/list/brpop.html

2.13.查看存儲類型:object encoding parent

127.0.0.1:6379> object encoding parent
"quicklist"
127.0.0.1:6379> 

3.List列表存儲原理

quicklist(快速列表)是ziplist 和linkedlist 的結合體。
quicklist.h,head 和tail 指向雙向列表的表頭和表尾

3.1.quicklist

在這裏插入圖片描述

typedef struct quicklist {
    quicklistNode *head;
    quicklistNode *tail;
    unsigned long count;        /* total count of all entries in all ziplists */
    unsigned long len;          /* number of quicklistNodes */
    int fill : QL_FILL_BITS;              /* fill factor for individual nodes */
    unsigned int compress : QL_COMP_BITS; /* depth of end nodes not to compress;0=off */
    unsigned int bookmark_count: QL_BM_BITS;
    quicklistBookmark bookmarks[];
} quicklist;

4.應用場景

4.1.時間線

1.用戶瀏覽記錄的時間線
2.網頁瀏覽

在這裏插入圖片描述

4.2.消息隊列

1.我們在存儲消息的時候,lpush 壓入隊列
2.我們消費消息的時候,rpop 先入先出的消費消息內容

4.3.JVM虛擬機中的棧

1.壓棧的處理:是先進後出,rpush,brpop
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章