個(gè)人網(wǎng)站備案要求重慶seo全面優(yōu)化
概要
Redis中的list類型相當(dāng)于雙端隊(duì)列,支持頭插,頭刪,尾插,尾刪,并且列表中的內(nèi)容是可以重復(fù)的。
如果搭配使用rpush和lpop,那么就相當(dāng)于隊(duì)列
如果搭配使用rpush和rpop,那么就相當(dāng)于棧
lpush
向列表中頭插一個(gè)或多個(gè)元素,返回list的長(zhǎng)度。如果key已經(jīng)存在,并且對(duì)應(yīng)的value不是list類型,則報(bào)錯(cuò)
當(dāng)插入多個(gè)元素時(shí),是一次頭插,例如插入1,2,3,4,那么列表中是4,3,2,1
演示:
lrange
查看list指定區(qū)間內(nèi)的元素,前閉后閉,支持負(fù)數(shù)(-1就相當(dāng)于倒數(shù)第一個(gè)元素),下標(biāo)從0開始,因此查看全部元素就是0,-1
演示:
展示的元素前面的序號(hào)并不是下標(biāo),而是結(jié)果集專用的序號(hào)
需要注意的是,如果我們給的下標(biāo)超出了list的范圍,如果是其他語(yǔ)言,可能就會(huì)報(bào)錯(cuò)或者拋出異常。但是在Redis中會(huì)盡可能的獲取對(duì)應(yīng)的內(nèi)容,這體現(xiàn)了Redis的魯棒性
lpushx
從左側(cè)插入,當(dāng)key不存在,用法和lpush一致,當(dāng)key存在,則插入失敗,返回0
演示:
Rpush
向列表中尾插一個(gè)或多個(gè)元素,返回list的長(zhǎng)度。如果key已經(jīng)存在,并且對(duì)應(yīng)的value不是list類型,則報(bào)錯(cuò)
演示:
rpushx
從右側(cè)插入,當(dāng)key不存在,用法和lpush一致,當(dāng)key存在,則插入失敗,返回0
演示:
lpop
頭刪list中的元素,返回取出的元素的值。當(dāng)列表為空則返回nil
演示:
rpop
尾刪list中的元素,返回取出的元素的值。當(dāng)列表為空則返回nil
演示:
lindex
獲取到指定位置的元素,時(shí)間復(fù)雜度為O(N),如果下標(biāo)非法則返回nil
演示:
linsert
在list的指定處插入元素,如果是before就插入在基準(zhǔn)值前面,如果是after就插入到基準(zhǔn)值后面,基準(zhǔn)值是在list中存在的值而非下標(biāo),時(shí)間復(fù)雜度是O(N)
演示:
如果存在多個(gè)相同的基準(zhǔn)值,那么只插入到第一個(gè)基準(zhǔn)值處
llen
獲取列表的長(zhǎng)度,如果key不存在則返回0
lrem
刪除指定的值,count為要?jiǎng)h除的個(gè)數(shù)
count的值 | 作用 |
---|---|
count > 0 | 從頭到尾,刪除count個(gè)指定的元素 |
count < 0 | 刪除所有指定的元素 |
count = 0 | 從尾到頭,刪除count個(gè)指定的元素 |
演示:
ltrim
保留列表中start和stop之間的元素,刪除兩邊的元素
演示:
lset
根據(jù)指定的下標(biāo),修改元素,如果下標(biāo)越界,則報(bào)錯(cuò)
演示:
blpop/brpop
類似于阻塞隊(duì)列,如果隊(duì)列為空,嘗試出隊(duì)列,阻塞隊(duì)列根據(jù)阻塞時(shí)間產(chǎn)生阻塞,期間Redis可以執(zhí)行其他命令,直到隊(duì)列不空,返回元素(如果超時(shí)了就返回nil)
命令中可以設(shè)置多個(gè)key,從左到右遍歷key,哪個(gè)key的list中不空,則返回元素
演示:
隊(duì)列不為空:
隊(duì)列為空時(shí):
先設(shè)置過期時(shí)間是100s
這邊的客戶端就阻塞了,啟動(dòng)另一個(gè)服務(wù)器,往隊(duì)列里插入元素
這個(gè)服務(wù)器插入完元素,上一個(gè)服務(wù)器就返回元素了
內(nèi)部編碼
編碼方式 | 細(xì)節(jié) |
---|---|
ziplist 壓縮列表 | 列表元素個(gè)數(shù)小于512個(gè)同時(shí)每個(gè)元素的長(zhǎng)度小于64字節(jié) |
linkedlist 倆表 | 不滿足上述條件 |
上述編碼方式是老版本的Redis使用的,新版本的Redis使用了quicklist,相當(dāng)于鏈表和壓縮列表的結(jié)合,整體是一個(gè)鏈表,每個(gè)鏈表的節(jié)點(diǎn)是一個(gè)壓縮鏈表
應(yīng)用場(chǎng)景
作為數(shù)組存儲(chǔ)多個(gè)元素
例如sql中有下面這兩張表
那么在Redis中可以通過以下關(guān)聯(lián)關(guān)系進(jìn)行組織數(shù)據(jù)
作為消息隊(duì)列
這三個(gè)消費(fèi)者誰(shuí)先執(zhí)行brpop命令,誰(shuí)就可以先拿到新來(lái)的元素