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