1. 程式人生 > >系統學習redis之五——redis數據類型之list類型及操作

系統學習redis之五——redis數據類型之list類型及操作

hello 保留 個數 描述 查詢 元素 例如 ltr 插入

list數據類型介紹

list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的所有值等等,操作中key可以理解為鏈表的名字。redis的list類型其實就是一個每個子元素都是string類型的雙向鏈表。我們可以通過push、pop操作從鏈表的頭部或者尾部添加刪除元素,這樣,list既可以作為棧,又可以作為隊列。

額,用兩個比較通俗的例子描述棧和隊列的區別:
棧:就像先往籃子裏裏面裝蘋果,裝滿之後再拿出來,先放進去的,會最後拿出來;後放進去的,最先拿出來。也就是先進後出,後進先出
隊列:就像吸管吸果粒一樣,從吸管的一頭進去,另一頭出去,先進入吸管的果粒就會先被吸出去,後進入吸管的,就後備吸出去。即先進先出,後進後出

list數據類型方法

  • lpush:在key對應的list的頭部添加字符串元素
  • rpush:在key對應list的尾部添加字符串元素
  • linsert:在key對應list的特定位置前或後添加字符串
  • lset:設置list中指定下標的元素值
  • lrem:從key對應list中刪除n個和value相同的元素(當n>0,表示從頭開始刪除;當n=0表示全部刪除;當n<0,表示從尾部開始刪除)
  • ltrim:保留指定key的值範圍內的數據
  • lpop:從list的頭部刪除元素,並返回已經刪除的元素
  • rpop:從list的尾部開始依次刪除元素,並返回已經刪除的元素,與lpop相對應
  • rpoplpush:從第一個list的尾部移除元素,並添加到第二個list的頭部
  • lindex:返回名稱為key的list中index位置的元素(即取索引值對應的元素)
  • llen:返回key對應list的長度(也就是顯示list裏面有多少個元素)

方法及操作

1)lpush:在key對應的list的頭部添加字符串元素
例如:給list1依次加入元素hello和world

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LPUSH list1 hello
(integer) 1
127.0.0.1:6379> LPUSH list1 world
(integer) 2     #這裏的2和上面返回的1不是表示是否成功,而是表示元素的個數,list裏面有兩個元素
127.0.0.1:6379> LRANGE list1 0 -1   # 0表示開頭第一個元素,-1表示list最後一個元素。這句話表示獲取list的開頭到結尾所有元素
1) "world"
2) "hello"          #註意,進去的時候的順序是hello在前,world在後,但是出來的時候就是world在前,hello在後了。也就是棧
127.0.0.1:6379> 

備註,同《系統學習redis之三——redis數據類型之string類型及操作》一樣,後面的例子也都在同一臺機器一次性操作完畢的,因為後面的代碼如果不加上“ [root@test101 redis-4.0.1]# src/redis-cli ”這一句。代碼高亮也會格式有問題,所以後面所有的例子中都加上了“[root@test101 redis-4.0.1]# src/redis-cli ”,只是為了格式問題。

2)rpush:在key對應list的尾部添加字符串元素
例如:在list3一次插入hello和world

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> RPUSH list3 hello
(integer) 1
127.0.0.1:6379> RPUSH list3 world
(integer) 2
127.0.0.1:6379> LRANGE list3 0 -1
1) "hello"    #這裏就是先進先出了,也就是隊列
2) "world"
127.0.0.1:6379> 

3)linsert:在key對應list的特定位置前或後添加字符串
例如:在list3的world前面加入字符串new1,在world的後面添加字符串new2

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list3 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> 
127.0.0.1:6379> LINSERT list3 before world new1
(integer) 3
127.0.0.1:6379> LRANGE list3 0 -1
1) "hello"
2) "new1"   #在world的前面添加new1添加成功
3) "world"
127.0.0.1:6379> LINSERT list3 after world new2
(integer) 4
127.0.0.1:6379> LRANGE list3 0 -1
1) "hello"
2) "new1"
3) "world"
4) "new2"            #在world的後面添加new1添加成功
127.0.0.1:6379> 

4)lset:設置list中指定下標的元素值
例如:下面將list5裏面下標為1的元素改為four

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LPUSH list5 one
(integer) 1
127.0.0.1:6379> LPUSH list5 two
(integer) 2
127.0.0.1:6379> LPUSH list5 three
(integer) 3
127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LSET list5 1 four  #將下標為1的元素,改為four
OK
127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "four"       #原來的two就變成了four
3) "one"
127.0.0.1:6379> 

5)lrem:從key對應list中刪除n個和value相同的元素(當n>0,表示從頭開始刪除;當n=0表示全部刪除;當n<0,表示從尾部開始刪除)
例如:從list5中刪除n個元素one
當n為正值,且不等於0,表示從頭刪除n個和指定值相同的元素

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "one"
3) "one"
4) "one"
5) "two"
6) "three"
7) "four"
127.0.0.1:6379> LREM list5 3 "one"   #從list5中刪除3個one,最前面的3個one被刪除了
(integer) 3         #這裏的3,表示的是刪除的元素的個數
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
127.0.0.1:6379> 

當n=0,表示將list裏面所有和指定值相同的元素刪除掉

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1   #這裏設置為0,表示將所有的one都全部刪除
1) "one"
2) "one"
3) "three"
4) "four"
127.0.0.1:6379> LREM list5 0 "one"
(integer) 2
127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "four"
127.0.0.1:6379> 

當n<0,表示從尾部開始刪除n個和指定值相同的元素

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "one"
3) "two"
4) "one"
5) "three"
6) "four"
127.0.0.1:6379> LREM list5 -1 "one"   #設置賦值-1,就會從尾部開始刪除1個one,因此排在最後的那個one就被刪除了
(integer) 1
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "one"
3) "two"
4) "three"
5) "four"
127.0.0.1:6379> 

6)ltrim:保留指定key的值範圍內的數據
例如:保留list5裏面指定範圍之內的數據

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "one"
3) "one"
4) "two"
5) "three"
6) "four"
127.0.0.1:6379> LTRIM list5 1 4   #保留list5裏面下標為1-下標為4的元素,其他的都刪除
OK
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "one"
3) "two"
4) "three"
127.0.0.1:6379> LTRIM list5 2 -1   #保留list5裏面下標為2-最後一個元素,其他的都刪除
OK
127.0.0.1:6379> LRANGE list5 0 -1
1) "two"
2) "three"
127.0.0.1:6379> 

7)lpop:從list的頭部刪除元素,並返回已經刪除的元素
例如:將list5裏面的元素依次刪除

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> LPOP list5
"one"       #刪除的第一個元素是one
127.0.0.1:6379> LRANGE list5 0 -1
1) "two"
2) "three"
127.0.0.1:6379> LPOP list5
"two"       #刪除的第二個元素是two
127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
127.0.0.1:6379> LPOP list5
"three"         #刪除的第三個元素是three
127.0.0.1:6379> LRANGE list5 0 -1   #到最後,list就空了
(empty list or set)
127.0.0.1:6379> 

8)rpop:從list的尾部開始依次刪除元素,並返回已經刪除的元素,與lpop相對應
例如:從尾部依次刪除list5的元素

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1   #這是當前list5的所有元素
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> RPOP list5
"one"
127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "two"
127.0.0.1:6379> RPOP list5
"two"
127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
127.0.0.1:6379> RPOP list5
"three"
127.0.0.1:6379> LRANGE list5 0 -1   #list5裏面的元素已經刪除完畢,為空了
(empty list or set)
127.0.0.1:6379> 

9)rpoplpush:從第一個list的尾部移除元素,並添加到第二個list的頭部
例如:把list5裏面最後一個元素移除,並將其添加到list6的頭部

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LRANGE list6 0 -1
1) "four"
2) "three"
127.0.0.1:6379> RPOPLPUSH list5 list6   #從下面的結果可以看到,list5尾部的元素“one”已經被移除,並且被添加到了list6的頭部字一個元素
"one"
127.0.0.1:6379> LRANGE list5 0 -1
1) "two"
127.0.0.1:6379> LRANGE list6 0 -1
1) "one"
2) "four"
3) "three"
127.0.0.1:6379> 

10)lindex:返回名稱為key的list中index位置的元素(即取索引值對應的元素)
例如:取list6中索引值為0、1、2對應的元素

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list6 0 -1
1) "one"
2) "four"
3) "three"
127.0.0.1:6379> LINDEX list6 0  #這裏的0就是索引值,也就是one的下標值
"one"
127.0.0.1:6379> LINDEX list6 1
"four"
127.0.0.1:6379> LINDEX list6 2
"three"
127.0.0.1:6379> 

11)llen:返回key對應list的長度(也就是顯示list裏面有多少個元素)
例如:查詢list6裏面list長度

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list6 0 -1
1) "one"
2) "four"
3) "three"
127.0.0.1:6379> LLEN list6
(integer) 3             #list6裏面有3個元素,所以這裏的返回值是3
127.0.0.1:6379> 

系統學習redis之五——redis數據類型之list類型及操作