Redis命令介紹之列表的操作命令(第一部分)

前文中我們已經介紹了Redis中有關於字符串的操作命令,以及一些對鍵值對操作的命令。在本文中,我們將介紹一種新類型的相關命令——列表(List)。列表是編程中非常常用的一種數據結構,通常有線性表(數組)與鏈表兩種的實現。在Redis中,列表便是使用鏈表進行實現。由於篇幅的問題,列表的命令將分爲兩篇文章進行介紹。

LPUSH / RPUSH

LPUSHRPUSH命令用於將元素插入隊列中,並在Redis 2.4以上版本支持一次將一個或多個元素插入隊列中。兩個命令的區別爲LPUSH將新元素插入到隊列的隊首位置,而RPUSH命令將元素插入到隊尾位置。命令執行後將返回插入元素後隊列的長度。當鍵不存在,將創建一個空白的隊列並執行插入操作;若鍵存在但不爲隊列,將返回錯誤。

LPUSH key element [element ...]
RPUSH key element [element ...]

當使用LPUSH插入多個元素時,將逐個將元素插入到隊首。如插入abc後,隊列中的順序爲cba

當使用RPUSH插入多個元素時,將逐個將元素插入到隊尾。如插入abc後,隊列中的順序爲abc

示例

使用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 ...]

LPUSHXRPUSHX命令在執行後,將返回列表的長度。若鍵不存在則返回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命令用於獲取列表中由索引值startstop指定的範圍內的元素,索引值從0開始(即0爲列表中第一個元素),負數值表示相對於列表隊尾的位置(如-1代表列表中最後一個元素,-2代表列表中倒數第二個元素)。LRANGE命令返回的元素將包含startstop範圍內的所有元素,如使用LRANGE list 0 10將獲取到索引爲010的總共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中列表操作的一部分命令,在後續的文章中將繼續介紹剩下的諸如LPOSLTRIM等命令。

歡迎大家關注我的公衆號“風紙”,或是掃下面的二維碼關注👇
風紙

參考文獻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章