1. 程式人生 > >【Redis筆記(四)】 Redis資料結構

【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則一直等待下去