前文中我們已經介紹了Redis中有關於字符串的操作命令,以及一些對鍵值對操作的命令。在本文中,我們將介紹一種新類型的相關命令——列表(List)。列表是編程中非常常用的一種數據結構,通常有線性表(數組)與鏈表兩種的實現。在Redis中,列表便是使用鏈表進行實現。由於篇幅的問題,列表的命令將分爲兩篇文章進行介紹。
LPUSH / RPUSH
LPUSH
與RPUSH
命令用於將元素插入隊列中,並在Redis 2.4以上版本支持一次將一個或多個元素插入隊列中。兩個命令的區別爲LPUSH
將新元素插入到隊列的隊首位置,而RPUSH
命令將元素插入到隊尾位置。命令執行後將返回插入元素後隊列的長度。當鍵不存在,將創建一個空白的隊列並執行插入操作;若鍵存在但不爲隊列,將返回錯誤。
LPUSH key element [element ...]
RPUSH key element [element ...]
當使用LPUSH
插入多個元素時,將逐個將元素插入到隊首。如插入a
、b
、c
後,隊列中的順序爲c
、b
、a
。
當使用RPUSH
插入多個元素時,將逐個將元素插入到隊尾。如插入a
、b
、c
後,隊列中的順序爲a
、b
、c
。
示例
使用LPUSH
插入元素:
redis> LPUSH cards "0001" "0002"
(integer) 2
redis> LRANGE cards 0 -1
1) "0002"
2) "0001"
redis> LPUSH cards "0003"
(integer) 3
redis> LRANGE cards 0 -1
1) "0003"
2) "0002"
3) "0001"
使用RPUSH
插入元素:
redis> RPUSH cards "0001" "0002"
(integer) 2
redis> LRANGE cards 0 -1
1) "0001"
2) "0002"
redis> LPUSH cards "0003"
(integer) 3
redis> LRANGE cards 0 -1
1) "0001"
2) "0002"
3) "0003"
已存在的鍵不爲列表:
redis> SET greeting "hello world"
OK
redis> LPUSH greeting "test"
(error) WRONGTYPE Operation against a key holding the wrong kind of value
LPUSHX / RPUSHX
LPUSHX
/RPUSHX
命令與LPUSH
/RPUSH
類似,區別爲它們僅在鍵已存在且爲列表的情況下才執行插入的操作。當鍵不存在時,將無操作被執行;當鍵存在但不爲列表類型時將返回錯誤。
LPUSHX key element [element ...]
RPUSHX key element [element ...]
LPUSHX
與RPUSHX
命令在執行後,將返回列表的長度。若鍵不存在則返回0
。
示例
redis> LPUSHX cards "0002" "0003"
(integer) 0
redis> LPUSH cards "0001"
(integer) 1
redis> LPUSHX cards "0002" "0003"
(integer) 3
redis> LRANGE cards 0 -1
1) "0003"
2) "0002"
3) "0001"
LLEN
LLEN
命令用於獲取列表中存儲的元素數量,若鍵不存在則當作空白的隊列(即返回0
)。當鍵存在但類型不爲隊列時將返回錯誤。
LLEN key
示例
redis> LLEN cards
(integer) 0
redis> LPUSH cards "0001" "0002"
(integer) 2
redis> LLEN cards
(integer) 2
LRANGE
LRANGE
命令用於獲取列表中由索引值start
及stop
指定的範圍內的元素,索引值從0
開始(即0
爲列表中第一個元素),負數值表示相對於列表隊尾的位置(如-1
代表列表中最後一個元素,-2
代表列表中倒數第二個元素)。LRANGE
命令返回的元素將包含start
及stop
範圍內的所有元素,如使用LRANGE list 0 10
將獲取到索引爲0
到10
的總共11個元素。
LRANGE key start stop
當索引超出列表邊界時,將只返回範圍內列表存在的元素,而不會返回錯誤。若偏移start
大於隊尾的位置,將返回空列表(即無元素);若偏移stop
大於隊尾的位置,將認爲只獲取到列表隊尾的位置。
示例
redis> RPUSH cards "0001" "0002" "0003"
(integer) 3
redis> LRANGE cards 0 1
1) "0001"
2) "0002"
redis> LRANGE cards 0 -1
1) "0001"
2) "0002"
3) "0003"
# 起始位置大於實際位置
redis> LRANGE cards 4 5
(empty array)
# 結束位置大於實際位置
redis> LRANGE cards 0 5
1) "0001"
2) "0002"
3) "0003"
LPOP / RPOP
LPOP
命令用於移除並返回隊列中的第一個元素,當鍵不存在時返回nil
。當列表中只有一個元素時,執行LPOP
命令後鍵將被刪除。
LPOP key
RPOP
命令與LPOP
相似,用於移除並返回列表中的最後一個元素。
RPOP key
示例
redis> LPOP cards
(nil)
redis> LPUSH cards "0001" "0002" "0003"
(integer) 3
redis> RPOP cards
"0001"
redis> LPOP cards
"0003"
redis> RPOP cards
"0002"
redis> LPOP cards
(nil)
LINDEX
LINDEX
命令用於獲取列表中指定索引的元素,當索引超出列表範圍時返回nil
。索引的值從0
開始,即0
代表列表中的第一個元素,1
代表列表中的第二個元素。當索引的值爲負數時,表示相對於列表隊尾的位置,如-1
代表列表中最後一個元素,-2
代表列表中倒數第二個元素。
LINDEX key index
示例
redis> RPUSH cards "0001" "0002" "0003"
(integer) 3
redis> LINDEX cards 0
"0001"
redis> LINDEX cards 1
"0002"
redis> LINDEX cards 3
(nil)
redis> LINDEX cards -1
"0003"
redis> LINDEX cards -2
"0002"
LSET
LSET
命令用於設置列表中指定位置的元素,當索引不在列表的範圍內時將返回錯誤。與LINDEX
相同,索引從0
開始,且負數值代表相對於隊尾的位置。
LSET key index element
示例
redis> RPUSH cards "0001" "0002" "0003"
(integer) 3
redis> LSET cards 0 "0004"
OK
redis> LSET cards -2 "0005"
OK
redis> LRANGE cards 0 -1
1) "0004"
2) "0005"
3) "0003"
LINSERT
LINSERT
命令用於將元素插入到指定元素pivot
之前或之後的位置,並返回插入元素後列表的長度。當元素pivot
不存在時,將返回-1
。若鍵不存在將視作其爲一個空的列表,不執行任何操作。
LINSERT key BEFORE|AFTER pivot element
示例
# 不存在的鍵
redis> LINSERT cards AFTER "0002" "0004"
(integer) 0
redis> LRANGE cards 0 -1
(empty array)
redis> RPUSH cards "0001" "0002" "0003"
(integer) 3
# 插入到元素之前
redis> LINSERT cards BEFORE "0002" "0004"
(integer) 4
# 插入到元素之後
redis> LINSERT cards AFTER "0002" "0005"
(integer) 5
# 不存在的元素
redis> LINSERT cards AFTER "0000" "0006"
(integer) -1
redis> LRANGE cards 0 -1
1) "0001"
2) "0004"
3) "0002"
4) "0005"
5) "0003"
LREM
LREM
命令用於移除隊列中指定數量與參數element
值相同的元素,並返回實際移除的元素數量。若鍵不存在,則是作爲一個空列表,執行後將返回0
(即無符合的元素被刪除)。
LREM key count element
LREM
命令執行的操作受到count
參數影響,不同的count
值執行的操作爲:
count > 0
時,將從隊首開始移除對應數量相同的元素;count < 0
時,將從隊尾開始移除對應數量相同的元素;count = 0
,將移除列表中所有相同的元素。
示例
redis> LREM mykey 1 "hello"
(integer) 0
redis> RPUSH mykey "hello" "redis" "hello" "redis" "hello"
(integer) 5
# 刪除不存在的值
redis> LREM mykey 1 "world"
(integer) 0
# 刪除存在的值
redis> LREM mykey 1 "hello"
(integer) 1
redis> LREM mykey 0 "hello"
(integer) 2
count
大於0的情況:
redis> RPUSH mykey "hello" "redis" "hello" "redis" "hello"
(integer) 5
redis> LREM mykey 2 "hello"
(integer) 2
redis> LRANGE mykey 0 -1
1) "redis"
2) "redis"
3) "hello"
count
小於0的情況:
redis> RPUSH mykey "hello" "redis" "hello" "redis" "hello"
(integer) 5
redis> LREM mykey -2 "hello"
(integer) 2
redis> LRANGE mykey 0 -1
1) "hello"
2) "redis"
3) "redis"
結束語
本文中已經介紹了Redis中列表操作的一部分命令,在後續的文章中將繼續介紹剩下的諸如LPOS
、LTRIM
等命令。
歡迎大家關注我的公衆號“風紙”,或是掃下面的二維碼關注👇