本篇內(nèi)容介紹了“redis列表List慢操作”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)專注于新鄉(xiāng)縣企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),購物商城網(wǎng)站建設(shè)。新鄉(xiāng)縣網(wǎng)站建設(shè)公司,為新鄉(xiāng)縣等地區(qū)提供建站服務(wù)。全流程定制制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
Redis的列表是一個雙鏈結(jié)構(gòu),跟java里面的LinkedList一樣,對于鏈表插入數(shù)據(jù)非??鞎r間復(fù)雜度為O(1),但是查詢需要遍歷這個鏈表時間復(fù)雜度為O(n),對于雙鏈表來說既可以從頭到尾遍歷也可以從尾遍歷的雙向遍歷,這個結(jié)構(gòu)有點(diǎn)跟我們的隊(duì)列和棧非常相似,該結(jié)構(gòu)常用來做異步隊(duì)列,將需要延后處理的任務(wù)結(jié)構(gòu)體序列化成字符串,放入Redis列表,另一個線程從這個列表中輪詢進(jìn)行處理當(dāng)然,我們的列表也提供這樣的操作,下面我們來試試常見的的命令操作。
列表是一個先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),常用于消息隊(duì)列和異步邏輯處理,它會確保元素的訪問順序性
>rpush name hello world(integer)2>llen name(integer)2>lpop name"hello">lpop name"world">lpop name(nil)
棧是先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),跟隊(duì)列遍歷順序相反,我們常見的羽毛球桶
>rpush name hello world(integer)2>rpop name"world">rpop name"hello"
lindex是對整個list進(jìn)行遍歷跟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ù)第二個元素以此類推,有點(diǎn)像約瑟夫環(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 1
OK
>lrange name 0 1
"hello"
"world"
>ltrim name 1 0
OK
>llen name
(integer)0
我們思考一個問題,如果list的結(jié)構(gòu)是一個對象類型,每一個對象保存上一個元素地址和下一個元素地址每塊地址都在不同磁盤空間內(nèi),每個對象都保留一個指針,在搜索的時候我們勢必需要每次來回掃描磁盤,這個開銷是非常大的,而且在列表回收的時候整理磁盤碎片會變得非常麻煩,那么咱們可以想象,如果我們的對象是保存在連續(xù)空間內(nèi),每次查詢下一個指針的時候是不是就非??焖僬业皆撛兀恍枰獊砘貟弑P,在回收的時候,我們只需要對這塊內(nèi)存標(biāo)記回收即減少磁盤碎片的整理。
其實(shí)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的底層原理在今后的文章中會提出來
“Redis列表List慢操作”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!