1. 程式人生 > >Redis實用指令(三)——List

Redis實用指令(三)——List

Lpush:命令將一個或多個值插入到列表頭部。 如果 key 不存在,一個空列表會被建立並執行 LPUSH 操作。 當 key 存在但不是列表型別時,返回一個錯誤。
Lpushx:將一個或多個值插入到已存在的列表頭部,列表不存在時操作無效。
注意比較這兩個在指令的異同:
相同點:1、都是把值放入列表的頭部(索引是0);2、都可以同時插入多個值;3、當key的型別不匹配時都會返回錯誤;4、返回結果都是操作後列表的長度。
不同點:當操作的key不存在時,lpush會建立一個,lpushx返回0,不會建立列表。

redis 127.0.0.1:6379> LPUSH list1 "foo"
(integer) 1 redis 127.0.0.1:6379> LPUSHX list1 "bar" (integer) 2 redis 127.0.0.1:6379> LPUSHX list2 "bar" (integer) 0 redis 127.0.0.1:6379> LRANGE list1 0 -1 1) "foo" 2) "bar"

Lset :通過索引來設定元素的值。當索引引數超出範圍,或對一個空列表進行 LSET 時,返回一個錯誤。
這裡說的是通過索引來設定元素的值,我覺得用修改來說更貼切些,因為這裡的lset不會建立,只是用來對現有的值進行修改。

127.0.0.1
:6379> lrange mylist 0 -1 1) "kun" 2) "pang" 127.0.0.1:6379> lset mylist 2 aa (error) ERR index out of range 127.0.0.1:6379> lset mylist 1 aa OK 127.0.0.1:6379> lrange mylist 0 -1 1) "kun" 2) "aa" 127.0.0.1:6379>

Lindex :用於通過索引獲取列表中的元素。你也可以使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。

127.0
.0.1:6379> lindex mylist 2 (nil) 127.0.0.1:6379> lindex mylist 1 "aa" 127.0.0.1:6379>

Linsert :命令用於在列表的元素前或者後插入元素。 當指定元素不存在於列表中時,不執行任何操作。 當列表不存在時,被視為空列表,不執行任何操作。 如果 key 不是列表型別,返回一個錯誤。

127.0.0.1:6379> linsert mylist before kun pang
(integer) 3
127.0.0.1:6379> linsert mylist after kun k2
(integer) 4
127.0.0.1:6379> linsert mylist after kun1 k2
(integer) -1
127.0.0.1:6379> lrange mylist 0 -1
1) "pang"
2) "kun"
3) "k2"
4) "aa"
127.0.0.1:6379> 

在指令中用before就是在指定元素之前插入,如果用after就是在之後插入。
有一點這裡沒有說明,如果一個列表中存在兩個一樣的值,插入的時候以哪個值為標準,這裡我測試了下:

127.0.0.1:6379> lpush mylist k2
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "k2"
2) "pang"
3) "kun"
4) "k2"
5) "aa"
127.0.0.1:6379> linsert mylist after k2 af
(integer) 6
127.0.0.1:6379> lrange mylist 0 -1
1) "k2"
2) "af"
3) "pang"
4) "kun"
5) "k2"
6) "aa"
127.0.0.1:6379> linsert mylist after k2 af
(integer) 7
127.0.0.1:6379> lrange mylist 0 -1
1) "k2"
2) "af"
3) "af"
4) "pang"
5) "kun"
6) "k2"
7) "aa"
127.0.0.1:6379> linsert mylist before k2 af
(integer) 8
127.0.0.1:6379> lrange mylist 0 -1
1) "af"
2) "k2"
3) "af"
4) "af"
5) "pang"
6) "kun"
7) "k2"
8) "aa"
127.0.0.1:6379> 

這裡的結果顯示,如果有兩個一樣的值,會以第一個值為標準來執行,多個的時候也一樣,大家可以試下。

Llen :返回列表的長度。 如果列表 key 不存在,則 key 被解釋為一個空列表,返回 0 。 如果 key 不是列表型別,返回一個錯誤。
Lpop :移除並返回列表的第一個元素。
Lrange :返回列表中指定區間內的元素,區間以偏移量 START 和 END 指定。 其中 0 表示列表的第一個元素, 1 表示列表的第二個元素,以此類推。 你也可以使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。(這個指令上邊一直在用)

Lrem :根據引數 COUNT 的值,移除列表中與引數 VALUE 相等的元素。
COUNT 的值可以是以下幾種:

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

這裡比較麻煩些,具體的還是通過實際操作來理解比較好。

127.0.0.1:6379> lrange mylist 0 -1
1) "b"
2) "k2"
3) "pang"
4) "k2"
5) "k2"
6) "kun"
7) "k2"
8) "aa"
127.0.0.1:6379> lrem mylist 1 af
(integer) 0
127.0.0.1:6379> lrem mylist 1 k2
(integer) 1
127.0.0.1:6379> lrange mylist 0 -1
1) "b"
2) "pang"
3) "k2"
4) "k2"
5) "kun"
6) "k2"
7) "aa"
127.0.0.1:6379> lpush mylist k2 k2 k2 k2
(integer) 11
127.0.0.1:6379> lrange mylist 0 -1
 1) "k2"
 2) "k2"
 3) "k2"
 4) "k2"
 5) "b"
 6) "pang"
 7) "k2"
 8) "k2"
 9) "kun"
10) "k2"
11) "aa"
127.0.0.1:6379> lrem mylist  3 k2
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "k2"
2) "b"
3) "pang"
4) "k2"
5) "k2"
6) "kun"
7) "k2"
8) "aa"
127.0.0.1:6379>

Ltrim : 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
下標 0 表示列表的第一個元素,以 1 表示列表的第二個元素,以此類推。 你也可以使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。

127.0.0.1:6379> lrange mylist 0 -1
1) "k2"
2) "b"
3) "pang"
4) "k2"
5) "k2"
6) "kun"
7) "k2"
8) "aa"
127.0.0.1:6379> ltrim mylist 2 -1
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "pang"
2) "k2"
3) "k2"
4) "kun"
5) "k2"
6) "aa"
127.0.0.1:6379> 

Blpop :移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
如果列表為空,返回一個 nil 。 否則,返回一個含有兩個元素的列表,第一個元素是被彈出元素所屬的 key ,第二個元素是被彈出元素的值。

127.0.0.1:6379> lrange mylist 0 -1
1) "pang"
2) "k2"
3) "k2"
4) "kun"
5) "k2"
6) "aa"
127.0.0.1:6379> blpop myl 10
(nil)
(10.01s)(沒有找到要移除的值,實際等待了10.01秒)
127.0.0.1:6379> blpop mylist 5
1) "mylist"(列表名:key)
2) "pang"(被移除的value127.0.0.1:6379> lrange mylist 0 -1
1) "k2"
2) "k2"
3) "kun"
4) "k2"
5) "aa"
127.0.0.1:6379> 

Brpop:移出並獲取列表的最後一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
值得注意的是,Blpop 和Brpop都可以同時對多個list進行操作,首先被移除的是第一個列表的值,當第一個列表為空的時候才會對後邊列表一次操作。

(本例是blpop )
127.0.0.1:6379> lpush list1 value1 valuea valueb
(integer) 3
127.0.0.1:6379> lpush list2 value2 valuea valueb
(integer) 3
127.0.0.1:6379> blpop list1 list2 value1 5
1) "list1"
2) "valueb"
127.0.0.1:6379> blpop list1 list2 valuea 5
1) "list1"
2) "valuea"
127.0.0.1:6379> lrange list2 0 -1
1) "valueb"
2) "valuea"
3) "value2"
127.0.0.1:6379> blpop list1 list2 value1 5
1) "list1"
2) "value1"
127.0.0.1:6379> lrange list1 0 -1
(empty list or set)
127.0.0.1:6379> lrange list2 0 -1
1) "valueb"
2) "valuea"
3) "value2"
127.0.0.1:6379> blpop list1 list2 value1 5
1) "list2"
2) "valueb"
127.0.0.1:6379> 

Brpoplpush :從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
第一個列表中的值會被移除,且操作的是最後一個。

127.0.0.1:6379> lrange list1 0 -1
1) "valueb"
2) "valuea"
127.0.0.1:6379> lrange list2 0 -1
1) "valuea"
2) "value2"
127.0.0.1:6379> brpoplpush list1 list2 5
"valuea"
127.0.0.1:6379> lrange list1 0 -1
1) "valueb"

Rpop :移除並返回列表的最後一個元素。
Rpoplpush :移除列表的最後一個元素,並將該元素新增到另一個列表並返回。
Rpush :將一個或多個值插入到列表的尾部(最右邊)。
如果列表不存在,一個空列表會被建立並執行 RPUSH 操作。 當列表存在但不是列表型別時,返回一個錯誤。
Rpushx:將一個或多個值插入到已存在的列表尾部(最右邊)。如果列表不存在,操作無效。

Rpush 、Rpushx、Lpush 和Lpushx這四個指令可以對比著檢視理解。