前言
Redis作為cache服務(wù)器,支持多種數(shù)據(jù)結(jié)構(gòu)买猖,String改橘、List、Hash玉控、Set飞主、Zset。多種數(shù)據(jù)結(jié)構(gòu)的存在高诺,使得Redis
適用于多種業(yè)務(wù),Redis的適用也越發(fā)廣泛碌识,本文就介紹Redis中最簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)List
的操作命令。
簡(jiǎn)介
List
顧名思義虱而,即鏈表筏餐、隊(duì)列。即一個(gè)key
對(duì)應(yīng)的value
為一個(gè)隊(duì)列,支持頭插薛窥、尾插等操作胖烛。
命令簡(jiǎn)介
[LR]PUSH 命令
語(yǔ)法
: [LR]PUSH key value1 [value2 ...]
作用
: 以頭插或尾插方式插入指定key
隊(duì)列中一個(gè)或多個(gè)元素
返回
: 成功返回插入后的隊(duì)列中元素個(gè)數(shù)
頭插法插入N個(gè)元素
127.0.0.1:6379> LPUSH list val1 val2 val3
(integer) 3
尾插法插入N個(gè)元素
127.0.0.1:6379> RPUSH list val1 val2 val3
(integer) 6
List
中的所有元素
127.0.0.1:6379> LRANGE list 0 -1
- "val3"
- "val2"
- "val1"
- "val1"
- "val2"
- "val3"
[LR]PUSHX 命令
語(yǔ)法
: [LR]PUSHX key value
作用
: 以頭插或尾插方式插入指定key
隊(duì)列中一個(gè)或多個(gè)元素
返回
: 當(dāng)指定的隊(duì)列不存在時(shí)眼姐,返回0
,否則插入成功返回插入后隊(duì)列中的元素個(gè)數(shù)
向一個(gè)不存在的隊(duì)列中以頭插法插入一個(gè)節(jié)點(diǎn)
127.0.0.1:6379> LPUSHX list value
(integer) 0
向一個(gè)存在的隊(duì)列中以頭插法插入一個(gè)節(jié)點(diǎn)
127.0.0.1:6379> LRANGE list 0 -1
- "value"
127.0.0.1:6379> LPUSHX list value
(integer) 2
尾插法命令使用方式與頭插法類(lèi)似,此處不做過(guò)多介紹
LINSERT 命令
語(yǔ)法
: LINSERT key where refVal value
作用
: 在已存在的隊(duì)列key
中指定的節(jié)點(diǎn)refval
位置的前或后插入節(jié)點(diǎn)value
佩番。where
為after
時(shí)在指定節(jié)點(diǎn)后插入众旗,before
為在指定節(jié)點(diǎn)前插入
返回
: 隊(duì)列不存在則返回0;如果指定節(jié)點(diǎn)refVal
不存在,則不做任何操作并返回-1
趟畏,否則按照指定位置插入新元素贡歧,并返回插入后節(jié)點(diǎn)個(gè)數(shù)
向一個(gè)不存在的隊(duì)列中插入元素
127.0.0.1:6379> LINSERT list after value value1
(integer) 0
向一個(gè)已經(jīng)存在的隊(duì)列中,指定一個(gè)不存在節(jié)點(diǎn)位置插入
127.0.0.1:6379> LRANGE list 0 -1
- "value"
- "value"
127.0.0.1:6379> LINSERT list after value1 value11
(integer) -1
向一個(gè)已經(jīng)存在的隊(duì)列中,指定一個(gè)存在的節(jié)點(diǎn)位置后插入新元素
127.0.0.1:6379> LINSERT list after value value11
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
- "value"
- "value11"
- "value"
向一個(gè)已經(jīng)存在的隊(duì)列中赋秀,指定一個(gè)存在的節(jié)點(diǎn)位置前插入新元素
127.0.0.1:6379> LINSERT list before value value11
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
- "value11"
- "value"
- "value11"
- "value"
注意
:當(dāng)指定的節(jié)點(diǎn)在隊(duì)列中存在多個(gè)時(shí),隊(duì)列按照從頭到尾的優(yōu)先級(jí)方式進(jìn)行匹配
LLEN 命令
語(yǔ)法
: LLEN key
作用
: 返回隊(duì)列中元素的個(gè)數(shù)
返回
: 隊(duì)列不存在返回0
,存在則返回隊(duì)列中元素個(gè)數(shù)
127.0.0.1:6379> LLEN listlist
(integer) 0
127.0.0.1:6379> LLEN list
(integer) 4
LINDEX 命令
語(yǔ)法
: LINDEX key index
作用
: 返回指定隊(duì)列指定下標(biāo)index
處的元素
返回
: 隊(duì)列不存在利朵,返回NULL
, index
大于隊(duì)列元素個(gè)數(shù),也返回NULL
,否則返回對(duì)應(yīng)的節(jié)點(diǎn)元素猎莲。index
如果小于0,則下標(biāo)逆向遍歷
隊(duì)列不存在的情況
127.0.0.1:6379> LINDEX list111 1
(nil)
指定下標(biāo)的元素不存在
127.0.0.1:6379> LINDEX list 100
(nil)
獲取指定下標(biāo)的元素
127.0.0.1:6379> LINDEX list 1
"value"
LSET 命令
語(yǔ)法
: LSET key index value
作用
: 設(shè)置隊(duì)列指定下標(biāo)出的元素為新值value
返回
: 隊(duì)列不存在或下標(biāo)越界均返回錯(cuò)誤
,否則設(shè)置成功返貨OK
隊(duì)列不存在
127.0.0.1:6379> LSET listlist 2 value
(error) ERR no such key
下標(biāo)越界
127.0.0.1:6379> LSET list 100 value
(error) ERR index out of range
成功設(shè)置
127.0.0.1:6379> LRANGE list 0 -1
- "value11"
- "value"
- "value11"
- "value"
127.0.0.1:6379> LSET list 0 value123
OK
127.0.0.1:6379> LRANGE list 0 -1 - "value123"
- "value"
- "value11"
- "value"
[LR]POP 命令
語(yǔ)法
: [LR]POP key
作用
: 從隊(duì)列的頭或未彈出節(jié)點(diǎn)元素(返回該元素并從隊(duì)列中刪除)
返回
: 成功則返回元素,失敗則返回NULL
失敗
127.0.0.1:6379> LPOP listlist
(nil)
127.0.0.1:6379> LPOP list
"value123"
127.0.0.1:6379> RPOP list
"value"
LRANGE 命令
語(yǔ)法
: LRANGE key start end
作用
: 返回隊(duì)列指定區(qū)間的元素, start
绍弟、end
可以為負(fù)數(shù),逆向遍歷
返回
: 成功則返回元素,失敗則返回NULL
隊(duì)列不存在
127.0.0.1:6379> LRANGE listlist 0 -1 s
(empty list or set)
區(qū)間指定錯(cuò)誤
127.0.0.1:6379> LRANGE list 0 -1
- "val6"
- "val5"
- "val4"
- "val3"
- "val2"
- "val1"
127.0.0.1:6379> LRANGE list 100 200
(empty list or set)
獲取指定區(qū)間的值
127.0.0.1:6379> LRANGE list 2 4
- "val4"
- "val3"
- "val2"
127.0.0.1:6379> LRANGE list -4 -2 - "val4"
- "val3"
- "val2"
獲取整個(gè)隊(duì)列的值
127.0.0.1:6379> LRANGE list 0 -1
- "val6"
- "val5"
- "val4"
- "val3"
- "val2"
- "val1"
LTRIM 命令
語(yǔ)法
: LTRIM key start end
作用
: 截取隊(duì)列指定區(qū)間的元素,其余元素都刪除
返回
: 成功則返回OK
測(cè)試鏈表元素值
127.0.0.1:6379> LRANGE list 0 -1
- "val6"
- "val5"
- "val4"
- "val3"
- "val2"
- "val1"
截取指定區(qū)間的值
127.0.0.1:6379> LTRIM list 2 4
OK
127.0.0.1:6379> LRANGE list 0 -1
- "val4"
- "val3"
- "val2"
區(qū)間值錯(cuò)誤
127.0.0.1:6379> LTRIM list -1 0
OK
127.0.0.1:6379> LRANGE list 0 -1
(empty list or set)
區(qū)間值錯(cuò)誤,導(dǎo)致整個(gè)鏈表為空
LREM 命令
語(yǔ)法
: LTRIM key toremove value
作用
: 刪除隊(duì)列中指定值的節(jié)點(diǎn)著洼,刪除方式由toremove
決定, toremove
大于0
則從頭遍歷刪除,最多刪除toremove
個(gè)節(jié)點(diǎn);
toremove
小于0
則從尾遍歷刪除,最多刪除toremove
個(gè)節(jié)點(diǎn);
為0
則刪除所有值相同的節(jié)點(diǎn)
返回
: 返回刪除的節(jié)點(diǎn)個(gè)數(shù)
從頭刪除指定值為val
的節(jié)點(diǎn)
127.0.0.1:6379> LRANGE list 0 -1
- "val"
- "val1"
- "val"
- "val2"
- "val"
- "val3"
- "val"
- "val4"
- "val"
- "val5"
127.0.0.1:6379> LREM list 3 val
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1 - "val1"
- "val2"
- "val3"
- "val"
- "val4"
- "val"
- "val5"
隊(duì)列中值為val的節(jié)點(diǎn)數(shù)大于需要?jiǎng)h除的數(shù)樟遣,值刪除指定數(shù)量的節(jié)點(diǎn),如果隊(duì)列中節(jié)點(diǎn)數(shù)量不足呢身笤?
127.0.0.1:6379> LREM list 3 val
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
- "val1"
- "val2"
- "val3"
- "val4"
- "val5"
toremove
小于0的情況與大于0的情況類(lèi)似豹悬,不做介紹,下面簡(jiǎn)單介紹下為0的情況
127.0.0.1:6379> LRANGE list 0 -1
- "val"
- "val1"
- "val"
- "val2"
- "val"
- "val3"
- "val"
- "val4"
- "val"
- "val5"
127.0.0.1:6379> LREM list 0 val
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1 - "val1"
- "val2"
- "val3"
- "val4"
- "val5"
RPOPLPUSH 命令
語(yǔ)法
: RPOPLPUSH srcKey dstKey
作用
: 將源隊(duì)列src
的尾部元素插入dst
隊(duì)列的頭部
返回
: 成功返回插入的元素
源隊(duì)列
127.0.0.1:6379> LRANGE src 0 -1
- "val1"
- "val2"
- "val3"
目標(biāo)隊(duì)列(可以不存在的,如果不存在則會(huì)創(chuàng)建一個(gè)新的)
127.0.0.1:6379> LRANGE dst 0 -1
(empty list or set)
執(zhí)行命令
127.0.0.1:6379> RPOPLPUSH src dst
"val3"
127.0.0.1:6379> LRANGE src 0 -1
- "val1"
- "val2"
127.0.0.1:6379> LRANGE dst 0 -1 - "val3"
B[LR]POP 命令
語(yǔ)法
: B[LR]POP key1 [key2 ...] timeout
作用
: 從一個(gè)或多個(gè)隊(duì)列的頭或尾部彈出一個(gè)元素,如果指定的隊(duì)列集合中有一個(gè)隊(duì)列有元素則立即返回?cái)?shù)據(jù)液荸,否則阻塞等待timeout
時(shí)間,如果在指定時(shí)間內(nèi),隊(duì)列集合中有元素新增,則該操作返回瞻佛。否則超時(shí)時(shí)間到,自動(dòng)返回
返回
: 成功返回元素以及元素所屬隊(duì)列,失敗返回錯(cuò)誤
隊(duì)列集合中有元素
127.0.0.1:6379> BLPOP src dst 30
- "src"
- "val1"
隊(duì)列集合中沒(méi)有元素且超時(shí)
127.0.0.1:6379> BLPOP src dst 30
(nil)
(30.04s)
隊(duì)列集合中沒(méi)有元素,阻塞過(guò)程中隊(duì)列集合中新增了元素
127.0.0.1:6379> BLPOP src dst 300
- "src"
- "kkk"
(6.67s)
新增元素操作
127.0.0.1:6379> rpush src kkk
(integer) 1
阻塞的隊(duì)列尾部操作類(lèi)似娇钱,不做介紹
BRPOPLPUSH 命令
語(yǔ)法
: BRPOPLPUSH src dst timeout
作用
: 將指定隊(duì)列src
尾部的元素插入到dst
頭部伤柄,如果隊(duì)列src
為空,則操作阻塞timeout
時(shí)間忍弛,在阻塞時(shí)間內(nèi),如果隊(duì)列src
有新增元素响迂,則將src
隊(duì)列尾部元素插入到dst
頭部并返回,否則超時(shí)返回
返回
: 返回操作的元素
源隊(duì)列不為空
127.0.0.1:6379> BRPOPLPUSH src dst 300
"kkkk"
源隊(duì)列為空
127.0.0.1:6379> BRPOPLPUSH src dst 300
"jjj"
(11.68s)
新增操作
127.0.0.1:6379> rpush src jjj
(integer) 1
總結(jié)
List
是用得比較多的數(shù)據(jù)結(jié)構(gòu)之一,使用list可以輕易的構(gòu)造隊(duì)列细疚,比如存儲(chǔ)消息隊(duì)列之類(lèi)的,以完成FIFO
或FILO
的功能川梅。