Redis基本操作命令學習(三)之對List(鏈表類型)數據操作命令

List類型是redis數據庫的5大類型之一,List底層是一個數組,也可看做類似LinkedList;

1.新建一個key並添加數據(LPUSH、RPUSH)

LPUSH:從list左側新增一個元素,可一次插入多個元素(每次新增的元素都在鏈表左側插入)
RPUSH:從list右側新增一個元素

127.0.0.1:6379> lpush list 0  // 第一步 : 0
(integer) 1
127.0.0.1:6379> lpush list 1  // 第二步 :1  0
(integer) 2
127.0.0.1:6379> rpush list 2  // 第二步 :1  0  2
(integer) 3
127.0.0.1:6379> llen list     // 獲取list的長度
(integer) 3
127.0.0.1:6379> lrange list 0 5 // 獲取list的偏移範圍
1) "1"
2) "0"
3) "2"
2.從鏈表中提取數據(LPOP、RPOP)

LPOP:從list的左側取出第一個元素,元素取出後將會從list中剔除
RPOP:從list的右側取出第一個元素,元素取出後將會從list中剔除

127.0.0.1:6379> lpop list
"1"
127.0.0.1:6379> lrange list 0 5
1) "0"
2) "2"
127.0.0.1:6379> rpop list
"2"
127.0.0.1:6379> lrange list 0 5
1) "0"
3.通過索引獲取列表中的元素(LINDEX key index)

注意:index值不能超過列表總長度,列表左側下標從0開始,右側從-1開始

127.0.0.1:6379> lindex list 0      // 獲取下標索引爲0的元素
"0"
127.0.0.1:6379> rpush list redis   // 我們再來添加幾個元素
(integer) 2
127.0.0.1:6379> rpush list mongo
(integer) 3
127.0.0.1:6379> lpush list postgresql
(integer) 4                      // 代表添加新的元素後,列表的當前長度
127.0.0.1:6379> lrange list 0 9  // 獲取列表指定範圍內的元素(相當於JAVA中的
截取數據)
1) "postgresql"
2) "0"
3) "redis"
4) "mongo"
 // 列表元素: "postgresql"   "0"    "redis"    "mongo"
 下標分析:         0          1        2          3
                 -4          -3       -2         -1
127.0.0.1:6379> lindex list 6     // 獲取下標索引爲6的元素,已經超出列表總長度,返回空
(nil)
127.0.0.1:6379> lindex list 3
"mongo"
127.0.0.1:6379> lindex list -1
"mongo"
127.0.0.1:6379> lindex list -4
"postgresql"
4.修改某個元素值(LSET key index newValue)

注意:index下標值不能越界

127.0.0.1:6379> lrange list 0 9 
1) "postgresql"
2) "0"
3) "redis"
4) "mongo"
127.0.0.1:6379> lset list 1 kafka  // 修改下標爲1的元素值
OK
127.0.0.1:6379> lrange list 0 9    // 查看一下,修改成功
1) "postgresql"
2) "kafka"
3) "redis"
4) "mongo"
5.獲取列表長度(LLEN key)
127.0.0.1:6397> llen list
(integer) 4
6.獲取列表指定範圍內的數據(LRANGE key start stop )

注意:start值要小於等於stop值(start下標值始終要在stop下標值的左側,類似String類型的getrange命令),且不能超過列表總長度,否則獲取不到任何數據

127.0.0.1:6379> lrange list 3 2   // start下標值大於stop下標值
(empty list or set)
127.0.0.1:6379> lrange list 3 5   // 獲取元素時start和stop下標元素包含在獲取範圍內
1) "mongo"
127.0.0.1:6379> lrange list 0 -1  // 0是從列表左側開始,-1從列表右側開始
1) "postgresql"
2) "kafka"
3) "redis"
4) "mongo"
127.0.0.1:6397> lrange list 5 9   // 下標值超出列表長度
(empty list or set)
7.在某個元素之前或之後插入一個新的元素(LINSERT key BEFORE | AFTER oldValue newValue)

oldValue : 代表現有的某個元素值,不是下標值,如果oldValue不存在則返回-1;
newValue:代表要插入的新值
BEFORE | AFTER:代表要在現有值之前還是之後插入

127.0.0.1:6379> lrange list 0 -1
1) "postgresql"
2) "kafka"
3) "redis"
4) "mongo"
127.0.0.1:6379> linsert list before kafka drools
5
127.0.0.1:6379> lrange list 0 -1
1) "postgresql"
2) "drools"
3) "kafka"
4) "redis"
5) "mongo"

8.刪除鏈表中某個元素(LREM key count value)

LREM :是List 和 remove 兩個單詞的拼合組成;
value:代表要刪除的那個元素值;
count:在此處有2個作用,第一:當count > 0時,從鏈表的左側開始刪除;當count < 0時,從鏈表的右側開始刪除;當count = 0時,從鏈表中刪除與value值相同的全部元素值; 第二:count是幾就刪除幾個與value值相同的元素,如果count大於當前value值在鏈表中的個數時,則有幾個與value相同的值就刪除幾個;

127.0.0.1:6379> rpush test a b c d s a c x c a  // 先創建一個名爲test的鏈表
(integer) 10
127.0.0.1:6379> lrange test 0 -1   // 查看鏈表所有元素
1) "a"
2) "b"
3) "c"
4) "d"
5) "s"
6) "a"
7) "c"
8) "x"
9) "c"
10) "a"
127.0.0.1:6379> lrem test 2 a    // 要刪除的元素值爲a,2代表:從鏈表左側開始並且刪除2個元素爲a的值
(integer) 2
127.0.0.1:6379> lrange test 0 -1 // 我們再次查看鏈表,發現確實刪掉了2個元素值爲a的
1) "b"
2) "c"
3) "d"
4) "s"
5) "c"
6) "x"
7) "c"
8) "a"
127.0.0.1:6379> lrem test -1 c  // 我們再次測試一下,從鏈表右側開始刪除一個元素
(integer) 1
127.0.0.1:6379> lrange test 0 -1
1) "b"
2) "c"
3) "d"
4) "s"
5) "c"
6) "x"
7) "a"
127.0.0.1:6379> lrem test 0 c     // 來測試count值爲0時的情況
(integer) 2
127.0.0.1:6379> lrange test 0 -1  // 發現確實把元素值爲c的全部刪掉了
1) "b"
2) "d"
3) "s"
4) "x"
5) "a"
9.對鏈表進行截取,將截取後的值重新賦給key(LTRIM key start stop )

start 、stop:代表要截取的起始、結束下標值;stop值大於start值時會返回空;start和stop值都大於鏈表長度時會返回空;

// 對鏈表現有元素下標分析:b  d  s  x  a 
    下標:              0  1  2  3  4

127.0.0.1:6379> ltrim test 2 -1   // 解析截取操作
OK
127.0.0.1:6379> lrange test 0 -1  // 截取完成後,鏈表的值就是截取後的新鏈表值(原來爲 b d s x a,截取後變爲 s x a)
1) "s"
2) "x"
3) "a"
10.移除源鏈表的最後一個元素,並將該元素添加到另一個鏈表的頭部並返回(RPOPLPUSH sourceList targetList)

sourceList :源鏈表
targetList:目標鏈表

127.0.0.1:6379> rpush source a b c f  // 新建一個鏈表 作爲源
(integer) 4
127.0.0.1:6379> rpush targer g p s  // 再新增一個鏈表 作爲目標
(integer) 3 
127.0.0.1:6379>rpoplpush source target  // 進行操作,把源鏈表的最右側一個元素取出放入目標鏈表的頭部
"f"
127.0.0.1:6379>lrange source 0 -1
1)"a"
2)"b"
3)"c"
127.0.0.1:6379>lrange target 0 -1
1)"f"
2)"g"
3)"p"
4)"s"
11.刪除某一個鏈表(DEL key)
12.命令移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止(BRPOP key time / BLPOP key time);在線聊天場景適合使用此命令來進行設計

time爲0時會一直處於阻塞狀態,直到從鏈表中獲取到數據爲止;單位爲秒(s)

127.0.0.1:6379> lpush demo a b c
(integer) 3
127.0.0.1:6379> brpop demo 10 // 鏈表中有數據,即使設置了阻塞時間也會取出第一個元素
"c"
127.0.0.1:6379> brpop demo 10 // 鏈表中有數據,即使設置了阻塞時間也會取出第一個元素
"b"
127.0.0.1:6379> brpop demo 10 // 鏈表中有數據,即使設置了阻塞時間也會取出第一個元素
"a"
127.0.0.1:6379> brpop demo 10 //此時鏈表中已經沒有數據了,會阻塞10s,如果10s內獲取不到數據的話會結束本次命令的執行,返回nil
(nil)
(10s)
127.0.0.1:6379> brpop demo 0 // 鏈表中已經沒有數據了,會一直處於阻塞狀態,直到取出數據才結束本次命令的執行

示例:可以同時打開2個redis客戶端,對同一個key進行操作,使用blpop / brpop 命令進行操作查看效果(在一個客戶端進行阻塞操作,在另一個客戶端爲key進行添加元素操作)


總結 : 命令歸結起來就增刪改查這4種,
(1)新增:
LPUSH (從鏈表左側新增數值)、 RPUSH、
LINSERT(向鏈表中插入數值)、
RPOPLPUSH(將一個鏈表中的值取出後插入到另一個鏈表頭部)
(2)修改: LSET(根據下標去修改某個數值)
(3)刪除: LREM(刪除鏈表中指定的那個數值)、DEL(刪除key)
(4)查詢:
LPOP(從鏈表左側彈出第一個數值)、RPOP、
LRANGE(獲取某個key的全部元素)、
BRPOP(延時彈出最右側數值)、BLPOP、
LTRIM(根據下標截取元素後再重新賦給key)、
LINDEX(根據下標值獲取某個數值)、
LLEN(查看key的擁有元素個數)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章