目錄
一、概念
二、命令
2.1 LPUSH
2.2 LPUSHX
2.3 RPUSH
2.4 RPUSHX
2.5 LRANGE
2.6 LPOP
2.7 RPOP
2.8 LINDEX
2.9 LINSERT
2.10 LLEN
2.11 阻塞版本命令
三、內部編碼
一、概念
列表類型是用來存儲多個有序的字符串,列表中的每個字符串稱為元素(element),?個列表最多可以存儲 個元素。在 Redis 中,可以對列表兩端插入(push)和彈出(pop),還可以獲取指定范圍的元素列表、獲取指定索引下標的元素等。列表是?種比較靈活的數據結構,它可以充當棧和隊列的角色,在實際開發上有很多應用場景。
列表類型的特點:
? ?
第?、列表中的元素是有序的,這意味著可以通過索引下標獲取某個元素或者某個范圍的元素列表。
第?、區分獲取和刪除的區別。
第三、列表中的元素是允許重復的。
二、命令
2.1 LPUSH
將?個或者多個元素從左側放入(頭插)到 list 中。
語法:
LPUSH key element [element ...]
命令有效版本:1.0.0 之后
時間復雜度:只插入?個元素為 O(1), 插入多個元素為 O(N), N 為插入元素個數.
返回值:插?后 list 的長度。
示例:
redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
2.2 LPUSHX
在 key 存在時,將?個或者多個元素從左側放入(頭插)到 list 中。不存在,直接返回。
語法:
LPUSHX key element [element ...]
命令有效版本:2.0.0 之后
時間復雜度:只插入?個元素為 O(1), 插入多個元素為 O(N), N 為插入元素個數.
返回值:插入后 list 的長度。
示例:
(integer) 1
redis> LPUSHX mylist "Hello"
(integer) 2
redis> LPUSHX myotherlist "Hello"
(integer) 0
redis> LRANGE mylist 0 -1
1) "Hello"
2) "World"
redis> LRANGE myotherlist 0 -1
(empty array)
2.3 RPUSH
將?個或者多個元素從右側放入(尾插)到 list 中。
語法:
RPUSH key element [element ...]
命令有效版本:1.0.0 之后
時間復雜度:只插入?個元素為 O(1), 插入多個元素為 O(N), N 為插入元素個數.
返回值:插入后 list 的長度。
示例:
redis> RPUSH mylist "world"
(integer) 1
redis> RPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "world"
2) "hello"
2.4 RPUSHX
在 key 存在時,將?個或者多個元素從右側放入(尾插)到 list 中。
語法:
RPUSHX key element [element ...]
命令有效版本:2.0.0 之后
時間復雜度:只插入?個元素為 O(1), 插入多個元素為 O(N), N 為插入元素個數.
返回值:插入后 list 的長度。
示例:
redis> RPUSH mylist "World"
(integer) 1
redis> RPUSHX mylist "Hello"
(integer) 2
redis> RPUSHX myotherlist "Hello"
(integer) 0
redis> LRANGE mylist 0 -1
1) "World"
2) "Hello"
redis> LRANGE myotherlist 0 -1
(empty array)
2.5 LRANGE
獲取從 start 到 end 區間的所有元素,左閉右閉。
語法:
LRANGE key start stop
命令有效版本:1.0.0 之后
時間復雜度:O(N)
返回值:指定區間的元素。
示例:
redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> LRANGE mylist 0 0
1) "one"
redis> LRANGE mylist -3 2
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist -100 100
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist 5 10
(empty array)
2.6 LPOP
從 list 左側取出元素(即頭刪)。
語法:
LPOP key
命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:取出的元素或者 nil。
示例:
redis> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
redis> LPOP mylist
"one"
redis> LPOP mylist
"two"
redis> LPOP mylist
"three"
redis> LRANGE mylist 0 -1
1) "four"
2) "five"
2.7 RPOP
從 list 右側取出元素(即尾刪)。
語法:
RPOP key
命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:取出的元素或者 nil。
示例;
redis> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
redis> RPOP mylist
"five"
redis> LRANGE mylist 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
2.8 LINDEX
獲取從左數第 index 位置的元素。
語法:
LINDEX key index
命令有效版本:1.0.0 之后
時間復雜度:O(N)
返回值:取出的元素或者 nil。
示例:
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LINDEX mylist 0
"Hello"
redis> LINDEX mylist -1
"World"
redis> LINDEX mylist 3
(nil)
2.9 LINSERT
在特定位置插入元素。
語法:
LINSERT key <BEFORE | AFTER> pivot element
命令有效版本:2.2.0 之后
時間復雜度:O(N)
返回值:插?后的 list 長度。
示例:
redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2
redis> LINSERT mylist BEFORE "World" "There"
(integer) 3
redis> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"
2.10 LLEN
獲取 list 長度。
語法:
LLEN key
命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:list 的長度。
示例:
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LLEN mylist
(integer) 2
2.11 阻塞版本命令
blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和對應非阻塞版本的作用基本?致,除了:
在列表中有元素的情況下,阻塞和非阻塞表現是?致的。但如果列表中沒有元素,非阻塞版本會理
解返回 nil,但阻塞版本會根據 timeout,阻塞?段時間,期間 Redis 可以執行其他命令,但要求執
行該命令的客戶端會表現為阻塞狀態。
命令中如果設置了多個鍵,那么會從左向右進行遍歷鍵,?旦有?個鍵對應的列表中可以彈出元
素,命令立即返回。
如果多個客戶端同時多?個鍵執行?pop,則最先執行命令的客戶端會得到彈出的元素。
三、內部編碼
列表類型的內部編碼有兩種:
ziplist(壓縮列表):當列表的元素個數小于?list-max-ziplist-entries 配置(默認 512 個),同時
列表中每個元素的長度都小于?list-max-ziplist-value 配置(默認 64 字節)時,Redis 會選用
ziplist 來作為列表的內部編碼實現來減少內存消耗。
linkedlist(鏈表):當列表類型無法滿足?ziplist 的條件時,Redis 會使用?linkedlist 作為列表的內
部實現。