1. 程式人生 > 實用技巧 >Redis教程10-列表(List)常用命令使用參考2

Redis教程10-列表(List)常用命令使用參考2

1.LPOP

LPOP key

移除並返回列表key的頭元素。

可用版本:>= 1.0.0

時間複雜度:O(1)

返回值:

列表的頭元素。 當key不存在時,返回nil
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush ages 00 11 22 33 44 55 66    // 建立列表
(integer) 7
127.0.0.1:6379> lpop ages    // 移除頭第一個元素
"00"
127.0.0.1:6379> lpop ages    // 繼續移除頭第一個元素
"11"
127.0.0.1:6379> lpop names    //
key不存在, 返回nil (nil) 127.0.0.1:6379> set name redis666 OK 127.0.0.1:6379> lpop name // key型別不匹配, 報錯 (error) WRONGTYPE Operation against a key holding the wrong kind of value

2.LPUSH

LPUSH key value [value ...]

將一個或多個值value插入到列表key的表頭

如果有多個value值,那麼各個value值按從左到右的順序依次插入到表頭: 比如說,對空列表mylist執行命令LPUSHmylistabc

,列表的值將是cba,這等同於原子性地執行LPUSHmylistaLPUSHmylistbLPUSHmylistc三個命令。

如果key不存在,一個空列表會被建立並執行LPUSH操作。

key存在但不是列表型別時,返回一個錯誤。

在Redis 2.4版本以前的 LPUSH 命令,都只接受單個 value 值。

可用版本:>= 1.0.0

時間複雜度:O(1)

返回值:執行LPUSH命令後,列表的長度。

127.0.0.1:6379> exists ages
(integer) 0
127.0.0.1:6379> lpush ages 00 11    // 新增多個元素
(integer) 2
127.0.0.1:6379> lrange ages 0 -1 1) "11" 2) "00" 127.0.0.1:6379> lpush ages 22 // 新增單個元素 (integer) 3 127.0.0.1:6379> lpush ages 22 // 新增重複元素, 列表允許重複元素 (integer) 4 127.0.0.1:6379> lrange ages 0 -1 1) "22" 2) "22" 3) "11" 4) "00"

3.LPUSHX

LPUSHX key value

將值value插入到列表key的表頭,當且僅當key存在並且是一個列表。

LPUSH命令相反,當key不存在時,LPUSHX命令什麼也不做。

可用版本:>= 2.2.0

時間複雜度:O(1)

返回值:LPUSHX命令執行之後,表的長度。

127.0.0.1:6379> exists ages
(integer) 0
127.0.0.1:6379> lpushx ages 00    // key不存在, 不進行操作
(integer) 0
127.0.0.1:6379> exists ages
(integer) 0
127.0.0.1:6379> lpush ages 00    // 建立列表ages
(integer) 1
127.0.0.1:6379> lrange ages 0 -1
1) "00"
127.0.0.1:6379> lpushx ages 11     // 這次lpushx操作成功
(integer) 2
127.0.0.1:6379> lrange ages 0 -1
1) "11"
2) "00"

4.LRANGE

LRANGE key start stop

返回列表key中指定區間內的元素,區間以偏移量startstop指定。

下標(index)引數startstop都以0為底,也就是說,以0表示列表的第一個元素,以1表示列表的第二個元素,以此類推。

你也可以使用負數下標,以-1表示列表的最後一個元素,-2表示列表的倒數第二個元素,以此類推。

注意LRANGE命令和程式語言區間函式的區別

假如你有一個包含一百個元素的列表,對該列表執行LRANGElist010,結果是一個包含11個元素的列表,這表明stop下標也在LRANGE命令的取值範圍之內(閉區間),這和某些語言的區間函式可能不一致,比如Ruby的Range.newArray#slice和Python的range()函式。

超出範圍的下標

超出範圍的下標值不會引起錯誤。

如果start下標比列表的最大下標end(LLENlist減去1)還要大,那麼LRANGE返回一個空列表。

如果stop下標比end下標還要大,Redis將stop的值設定為end

可用版本:>= 1.0.0

時間複雜度:O(S+N),S為偏移量startN為指定區間內元素的數量。

返回值:一個列表,包含指定區間內的元素。

127.0.0.1:6379> rpush ages 00 11 22 33 44 55 66
(integer) 7
127.0.0.1:6379> lrange ages 0 -1    // 第一個元素到最後一個元素
1) "00"
2) "11"
3) "22"
4) "33"
5) "44"
6) "55"
7) "66"
127.0.0.1:6379> lrange ages 0 2    // 第一個元素到第三個元素
1) "00"
2) "11"
3) "22"
127.0.0.1:6379> lrange ages 0 10    // stop超過最大範圍, 忽略超過部分
1) "00"
2) "11"
3) "22"
4) "33"
5) "44"
6) "55"
7) "66"
127.0.0.1:6379> lrange ages 7 10    // start和end都不在範圍內
(empty list or set)
127.0.0.1:6379> lrange ages 0 0
1) "00"
127.0.0.1:6379>

5.LREM

LREM key count value

根據引數count的值,移除列表中與引數value相等的元素。

count的值可以是以下幾種:

  • count>0: 從表頭開始向表尾搜尋,移除與value相等的元素,數量為count
  • count<0: 從表尾開始向表頭搜尋,移除與value相等的元素,數量為count的絕對值。
  • count=0: 移除表中所有與value相等的值。

可用版本:>= 1.0.0

時間複雜度:O(N),N為列表的長度。

返回值:

被移除元素的數量。 因為不存在的key被視作空表(empty list),所以當key不存在時,LREM命令總是返回0
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379>
127.0.0.1:6379> rpush words aaa bbb ccc aaa bbb ccc aaa bbb ccc    // 建立列表
(integer) 9
127.0.0.1:6379> lrange words 0 -1
1) "aaa"
2) "bbb"
3) "ccc"
4) "aaa"
5) "bbb"
6) "ccc"
7) "aaa"
8) "bbb"
9) "ccc"
127.0.0.1:6379> lrem words 2 aaa    // 移除從表頭到表尾,最先發現的兩個 aaa    
(integer) 2
127.0.0.1:6379> lrange words 0 -1    // 前兩個aaa被刪除了
1) "bbb"
2) "ccc"
3) "bbb"
4) "ccc"
5) "aaa"
6) "bbb"
7) "ccc"
127.0.0.1:6379> lrem words -2 bbb    // 移除從表尾到表頭,最先發現的兩個bbb
(integer) 2
127.0.0.1:6379> lrange words 0 -1
1) "bbb"
2) "ccc"
3) "ccc"
4) "aaa"
5) "ccc"
127.0.0.1:6379> lrem words 0 ccc    // 移除表中所有 ccc
(integer) 3
127.0.0.1:6379> lrange words 0 -1
1) "bbb"
2) "aaa"