【Redis筆記(四)】 Redis資料結構
經過前面的介紹,我們學習了Redis中string字串、hash雜湊這兩種資料結構的常用命令。這篇文章將介紹Redis中的list – 列表的相關操作。
如果你還不知道string和hash是什麼(插播一條“小廣告”),可以先看看我的前兩篇文章:
list型別介紹
Redis中的list型別其實就是string型別的雙向連結串列。學過資料結構的童鞋都知道,既然是雙向連結串列,就很容易找到從頭部或尾部插入、刪除元素。這樣,list就可以當做棧或佇列來使用。在Redis中,list的最大長度為2^32-1。
list相關命令
1、lpush命令
lpush命令將一個或多個元素插入到列表的頭部,如果指定的key不存在,則先建立一個空列表,如果指定的key不是一個list型別,則返回一個錯誤。具體格式為:
lpush key value...
示例1:
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> set mystr not_a_list
OK
127.0.0.1:6379> lpush mystr d
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>
2、lrange命令
上面,我們使用lpush命令往列表中添加了元素,那麼我們怎麼知道指定的元素已經插入列表中呢?這是,我們可以使用lrange命令來檢視列表中指定範圍的元素。該命令的的具體格式如下:
lrange key start stop
對於lrange命令,我們需要知道一下幾點:
- lrange返回列表中下標範圍在[start, stop]中的元素。
- 列表的下標偏移量是基於0的,也就是從0開始。這跟我們程式語言中的陣列下標的計算方式一致。
- 偏移量可以是負數,表示該偏移量是從列表的尾部開始計數。比如-1表示列表的最後一個元素。
如果給定的下標超出列表下標的範圍,Redis不會產生錯誤。如果start大於列表尾部下標,返回一個空列表,如果stop大於列表尾部下標,則Redis會把列表的尾部下標當做實際的stop值。
示例2:
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "b"
3) "a"
3、lpushx命令
lpushx命令也用於在列表頭部插入元素。與lpush不同的是,當指定key不存在時,該命令並不會建立一個空列表,二是不進行任何操作,直接返回。具體格式如下:
lpushx key value
示例3:
127.0.0.1:6379> lpushx mylist a
(integer) 0
127.0.0.1:6379> lrange mylist 0 -1
(empty list or set)
127.0.0.1:6379> lpush mylist a
(integer) 1
127.0.0.1:6379> lpushx mylist b
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "b"
2) "a"
4、rpush命令
前面我們介紹了,list實際上是一個雙向連結串列,我們可以使用rpush命令從列表的尾部插入一個或多個元素。該命令操作成功後返回列表的長度。具體格式如下:
rpush key value
示例4:
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> rpush mylist d e f
(integer) 6
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "b"
3) "a"
4) "d"
5) "e"
6) "f"
5、rpushx命令
rpushx命令從列表尾部插入元素。與rpush不同的是,當指定列表不存在時,該命令並不會建立一個空列表,而是直接返回。具體格式如下:
rpushx key value
示例5:
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpushx mylist a
(integer) 0
127.0.0.1:6379> lrange mylist 0 -1
(empty list or set)
127.0.0.1:6379> lpush mylist a
(integer) 1
127.0.0.1:6379> rpushx mylist b
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
6、lpop命令
lpop命令移除並返回list的表頭元素。如果列表為空,則返回nil。具體格式如下:
lpop key
示例6:
127.0.0.1:6379> lpush mylist a
(integer) 1
127.0.0.1:6379> lpop mylist
"a"
127.0.0.1:6379> lpop mylist
(nil)
7、rpop命令
rpop命令移除並返回列表的尾部元素,如果列表為空,則返回nil。具體格式如下:
rpop key
示例7:
127.0.0.1:6379> lpush mylist a b
(integer) 2
127.0.0.1:6379> rpop mylist
"a"
127.0.0.1:6379> rpop mylist
"b"
8、lrem命令
lrem命令從列表中移除前count次出現的值為value的元素,返回被移除的元素個數。具體格式如下:
lrem key count value
其中count的含義如下:
- count = 0:移除所有值為value的元素
- count > 0:從頭部往尾部移除count個值為value的元素
count < 0:從尾部往頭部移除|count|(絕對值)個值為count的元素
示例8:
127.0.0.1:6379> lpush mylist a b a b c a e f
(integer) 8
127.0.0.1:6379> lrem mylist 0 a
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "f"
2) "e"
3) "c"
4) "b"
5) "b"
127.0.0.1:6379>
9、ltrim命令
ltrim命令用於剪下指定列表,並保留下標範圍為[start, stop]的元素。其中,start、stop均是從0開始計數的,也支援用負數來表示與列表尾部的偏移量。具體格式如下:
ltrim key start stop
示例9:
127.0.0.1:6379> lpush mylist a b c d e f // 插入後列表為f e d c b a
(integer) 6
127.0.0.1:6379> ltrim mylist 0 2
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "f"
2) "e"
3) "d"
10、lindex命令
lindex命令返回列表中指定下標的元素,下標從0開始計數,也可以使用負數表示從列表尾部開始的偏移值。如果指定的下標超出了列表的下標範圍則返回nil。具體格式如下:
lindex key index
示例10:
127.0.0.1:6379> lpush mylist a b c d e f
(integer) 6
127.0.0.1:6379> lindex mylist 2
"d"
11、llen命令
llen命令返回列表的長度,如果指定列表不存在,Redis會將其當做空列表並返回長度0。具體格式如下:
llen key
示例11:
127.0.0.1:6379> lpush mylist 1 2 3
(integer) 3
127.0.0.1:6379> llen mylist
(integer) 3
12、linsert命令
linsert是插入命令,它會在列表中查詢指定元素,並在該元素之前或之後插入一個元素。如果指定的列表不存在,則不進行任何操作。該命令的返回值為執行插入操作後列表的長度,如果沒有找到指定的值,則返回-1。具體格式如下:
linsert key after|before search value
示例12:
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush mylist a b c d
(integer) 4
127.0.0.1:6379> linsert mylist before b b1
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b1"
3) "b"
4) "c"
5) "d"
127.0.0.1:6379> linsert mylist before z no
(integer) -1
13、rpoplpush命令
rpoplpush命令對兩個列表進行原子操作:將列表source的尾部元素拿出來放到dest列表的頭部。如果列表source不存在,則返回nil值,並不進行任何操作。具體格式如下:
rpoplpush source dest:
示例13:
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush mylist1 a b
(integer) 2
127.0.0.1:6379> rpush mylist2 c d
(integer) 2
127.0.0.1:6379> rpoplpush mylist1 mylist2
"b"
127.0.0.1:6379> lrange mylist1 0 -1
1) "a"
127.0.0.1:6379> lrange mylist2 0 -1
1) "b"
2) "c"
3) "d"
14、lset命令
lset命令用來設定指定下標元素的值。具體格式如下:
lset key index value
示例14:
127.0.0.1:6379> rpush mylist a b
(integer) 2
127.0.0.1:6379> lset mylist 0 c
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "b"
除此之外,list的pop操作還有阻塞版本:
blpop key timeout
brpop key timeout
brpoplpush source destination timeout
timeout為等待超時時間,如果timeout為0則一直等待下去