Redis-列表(List)基础
Redis的列表是一個(gè)雙鏈結(jié)構(gòu),跟java里面的LinkedList一樣,對(duì)于鏈表插入數(shù)據(jù)非??鞎r(shí)間復(fù)雜度為O(1),但是查詢需要遍歷這個(gè)鏈表時(shí)間復(fù)雜度為O(n),對(duì)于雙鏈表來說既可以從頭到尾遍歷也可以從尾遍歷的雙向遍歷,這個(gè)結(jié)構(gòu)有點(diǎn)跟我們的隊(duì)列和棧非常相似,該結(jié)構(gòu)常用來做異步隊(duì)列,將需要延后處理的任務(wù)結(jié)構(gòu)體序列化成字符串,放入Redis列表,另一個(gè)線程從這個(gè)列表中輪詢進(jìn)行處理當(dāng)然,我們的列表也提供這樣的操作,下面我們來試試常見的的命令操作。
隊(duì)列(先進(jìn)先出)
列表是一個(gè)先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),常用于消息隊(duì)列和異步邏輯處理,它會(huì)確保元素的訪問順序性
>rpush name hello world(integer)2>llen name(integer)2>lpop name"hello">lpop name"world">lpop name(nil)棧(先進(jìn)后出)
棧是先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),跟隊(duì)列的出順序相反,我們常見的羽毛球桶
>rpush name hello world(integer)2>rpop name"world">rpop name"hello"List慢操作
lindex是對(duì)整個(gè)list進(jìn)行遍歷跟java里面的鏈表的get(int index)方法一樣,根據(jù)index獲取當(dāng)前位置的值,隨著index值越大性能越差,執(zhí)行時(shí)間效率為O(n)。
ltrim這個(gè)命令有兩個(gè)參數(shù)獲取一段區(qū)間范圍列表,ltrim命令會(huì)清理這個(gè)范圍外的元素,我們通過這個(gè)命令來獲取定長的列表
?lrange返回列表中指定區(qū)間內(nèi)的元素,與ltrim不同的是ltrim是直接截取某個(gè)區(qū)間的數(shù)據(jù),lrange是返回某個(gè)區(qū)間的數(shù)據(jù)
注意:index參數(shù)是可以為負(fù)數(shù)的,如果為-1那么就獲取倒數(shù)第一個(gè)元素,-2就是倒數(shù)第二個(gè)元素以此類推,有點(diǎn)像約瑟夫環(huán)
如果ltrim name?1 0意味著這個(gè)獲取的區(qū)間沒有元素,那么將清空整個(gè)列表
>rpush name hello world i am mango(integer)5>lindex name 1"world">lindex name -1"mango"?>ltrim name 0 1OK>lrange name 0 1"hello""world">ltrim name 1 0OK>llen name(integer)0快速列表
我們思考一個(gè)問題,如果list的結(jié)構(gòu)是一個(gè)對(duì)象類型,每一個(gè)對(duì)象保存上一個(gè)元素地址和下一個(gè)元素地址每塊地址都在不同磁盤空間內(nèi),每個(gè)對(duì)象都保留一個(gè)指針,在搜索的時(shí)候我們勢(shì)必需要每次來回掃描磁盤,這個(gè)開銷是非常大的,而且在列表回收的時(shí)候整理磁盤碎片會(huì)變得非常麻煩,那么咱們可以想象,如果我們的對(duì)象是保存在連續(xù)空間內(nèi),每次查詢下一個(gè)指針的時(shí)候是不是就非常快速找到該元素,不需要來回掃盤,在回收的時(shí)候,我們只需要對(duì)這塊內(nèi)存標(biāo)記回收即減少磁盤碎片的整理。
其實(shí)redis也是做了這樣的優(yōu)化,在這里我們稱之為快速鏈表(quicklist)的結(jié)構(gòu),如果列表元素較少的情況下,會(huì)使用一個(gè)連續(xù)的內(nèi)存存儲(chǔ)叫ziplist即壓縮列表,當(dāng)數(shù)據(jù)量比較大是ziplist會(huì)轉(zhuǎn)換成quicklist。Redis將鏈表和ziplist結(jié)合起來組成quicklist,也就是講ziplist使用雙向指針串起來使用,quicklist既滿足快速插入刪除性能,又不會(huì)出現(xiàn)太大的空間冗余。關(guān)于list的底層原理在今后的文章中會(huì)提出來
?
?
一名正在搶救的coder
筆名:mangolove
CSDN地址:https://blog.csdn.net/mango_love
GitHub地址:https://github.com/mangoloveYu
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Redis-列表(List)基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据之HBase部署
- 下一篇: MySQL学习笔记_6_SQL语言的设计