您好,登錄后才能下訂單哦!
本篇內容介紹了“Redis列表List慢操作”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Redis的列表是一個雙鏈結構,跟java里面的LinkedList一樣,對于鏈表插入數據非常快時間復雜度為O(1),但是查詢需要遍歷這個鏈表時間復雜度為O(n),對于雙鏈表來說既可以從頭到尾遍歷也可以從尾遍歷的雙向遍歷,這個結構有點跟我們的隊列和棧非常相似,該結構常用來做異步隊列,將需要延后處理的任務結構體序列化成字符串,放入Redis列表,另一個線程從這個列表中輪詢進行處理當然,我們的列表也提供這樣的操作,下面我們來試試常見的的命令操作。
列表是一個先進先出的數據結構,常用于消息隊列和異步邏輯處理,它會確保元素的訪問順序性
>rpush name hello world(integer)2>llen name(integer)2>lpop name"hello">lpop name"world">lpop name(nil)
棧是先進后出的數據結構,跟隊列遍歷順序相反,我們常見的羽毛球桶
>rpush name hello world(integer)2>rpop name"world">rpop name"hello"
lindex是對整個list進行遍歷跟java里面的鏈表的get(int index)方法一樣,根據index獲取當前位置的值,隨著index值越大性能越差,執行時間效率為O(n)。
ltrim這個命令有兩個參數獲取一段區間范圍列表,ltrim命令會清理這個范圍外的元素,我們通過這個命令來獲取定長的列表
lrange返回列表中指定區間內的元素,與ltrim不同的是ltrim是直接截取某個區間的數據,lrange是返回某個區間的數據
注意:index參數是可以為負數的,如果為-1那么就獲取倒數第一個元素,-2就是倒數第二個元素以此類推,有點像約瑟夫環
如果ltrim name 1 0意味著這個獲取的區間沒有元素,那么將清空整個列表
>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的結構是一個對象類型,每一個對象保存上一個元素地址和下一個元素地址每塊地址都在不同磁盤空間內,每個對象都保留一個指針,在搜索的時候我們勢必需要每次來回掃描磁盤,這個開銷是非常大的,而且在列表回收的時候整理磁盤碎片會變得非常麻煩,那么咱們可以想象,如果我們的對象是保存在連續空間內,每次查詢下一個指針的時候是不是就非常快速找到該元素,不需要來回掃盤,在回收的時候,我們只需要對這塊內存標記回收即減少磁盤碎片的整理。
其實redis也是做了這樣的優化,在這里我們稱之為快速鏈表(quicklist)的結構,如果列表元素較少的情況下,會使用一個連續的內存存儲叫ziplist即壓縮列表,當數據量比較大是ziplist會轉換成quicklist。Redis將鏈表和ziplist結合起來組成quicklist,也就是講ziplist使用雙向指針串起來使用,quicklist既滿足快速插入刪除性能,又不會出現太大的空間冗余。關于list的底層原理在今后的文章中會提出來
“Redis列表List慢操作”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。