Redis 數(shù)據(jù)結(jié)構(gòu)之 list

前言

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

  1. "val3"
  2. "val2"
  3. "val1"
  4. "val1"
  5. "val2"
  6. "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

  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佩番。whereafter時(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

  1. "value"
  2. "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

  1. "value"
  2. "value11"
  3. "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

  1. "value11"
  2. "value"
  3. "value11"
  4. "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

  1. "value11"
  2. "value"
  3. "value11"
  4. "value"
    127.0.0.1:6379> LSET list 0 value123
    OK
    127.0.0.1:6379> LRANGE list 0 -1
  5. "value123"
  6. "value"
  7. "value11"
  8. "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

  1. "val6"
  2. "val5"
  3. "val4"
  4. "val3"
  5. "val2"
  6. "val1"
    127.0.0.1:6379> LRANGE list 100 200
    (empty list or set)

獲取指定區(qū)間的值

127.0.0.1:6379> LRANGE list 2 4

  1. "val4"
  2. "val3"
  3. "val2"
    127.0.0.1:6379> LRANGE list -4 -2
  4. "val4"
  5. "val3"
  6. "val2"

獲取整個(gè)隊(duì)列的值

127.0.0.1:6379> LRANGE list 0 -1

  1. "val6"
  2. "val5"
  3. "val4"
  4. "val3"
  5. "val2"
  6. "val1"

LTRIM 命令

語(yǔ)法: LTRIM key start end
作用: 截取隊(duì)列指定區(qū)間的元素,其余元素都刪除
返回: 成功則返回OK

測(cè)試鏈表元素值

127.0.0.1:6379> LRANGE list 0 -1

  1. "val6"
  2. "val5"
  3. "val4"
  4. "val3"
  5. "val2"
  6. "val1"

截取指定區(qū)間的值

127.0.0.1:6379> LTRIM list 2 4
OK
127.0.0.1:6379> LRANGE list 0 -1

  1. "val4"
  2. "val3"
  3. "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

  1. "val"
  2. "val1"
  3. "val"
  4. "val2"
  5. "val"
  6. "val3"
  7. "val"
  8. "val4"
  9. "val"
  10. "val5"
    127.0.0.1:6379> LREM list 3 val
    (integer) 3
    127.0.0.1:6379> LRANGE list 0 -1
  11. "val1"
  12. "val2"
  13. "val3"
  14. "val"
  15. "val4"
  16. "val"
  17. "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

  1. "val1"
  2. "val2"
  3. "val3"
  4. "val4"
  5. "val5"

toremove小于0的情況與大于0的情況類(lèi)似豹悬,不做介紹,下面簡(jiǎn)單介紹下為0的情況

127.0.0.1:6379> LRANGE list 0 -1

  1. "val"
  2. "val1"
  3. "val"
  4. "val2"
  5. "val"
  6. "val3"
  7. "val"
  8. "val4"
  9. "val"
  10. "val5"
    127.0.0.1:6379> LREM list 0 val
    (integer) 5
    127.0.0.1:6379> LRANGE list 0 -1
  11. "val1"
  12. "val2"
  13. "val3"
  14. "val4"
  15. "val5"

RPOPLPUSH 命令

語(yǔ)法: RPOPLPUSH srcKey dstKey
作用: 將源隊(duì)列src的尾部元素插入dst隊(duì)列的頭部
返回: 成功返回插入的元素

源隊(duì)列

127.0.0.1:6379> LRANGE src 0 -1

  1. "val1"
  2. "val2"
  3. "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

  1. "val1"
  2. "val2"
    127.0.0.1:6379> LRANGE dst 0 -1
  3. "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

  1. "src"
  2. "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

  1. "src"
  2. "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)的,以完成FIFOFILO的功能川梅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疯兼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贫途,更是在濱河造成了極大的恐慌吧彪,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丢早,死亡現(xiàn)場(chǎng)離奇詭異姨裸,居然都是意外死亡秧倾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)傀缩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)那先,“玉大人,你說(shuō)我怎么就攤上這事赡艰∈鄣” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵慷垮,是天一觀的道長(zhǎng)揖闸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)料身,這世上最難降的妖魔是什么汤纸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮芹血,結(jié)果婚禮上蹲嚣,老公的妹妹穿的比我還像新娘。我一直安慰自己祟牲,他們只是感情好隙畜,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著说贝,像睡著了一般议惰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乡恕,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天言询,我揣著相機(jī)與錄音,去河邊找鬼傲宜。 笑死运杭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的函卒。 我是一名探鬼主播辆憔,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼报嵌!你這毒婦竟也來(lái)了虱咧?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锚国,失蹤者是張志新(化名)和其女友劉穎腕巡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體血筑,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绘沉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年煎楣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片车伞。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡择懂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帖世,到底是詐尸還是另有隱情休蟹,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布日矫,位于F島的核電站赂弓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏哪轿。R本人自食惡果不足惜盈魁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窃诉。 院中可真熱鬧杨耙,春花似錦、人聲如沸飘痛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宣脉。三九已至车柠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間塑猖,已是汗流浹背竹祷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羊苟,地道東北人塑陵。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蜡励,于是被迫代替她去往敵國(guó)和親令花。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容