Redis-第十章節-鏈表

目錄

  • 數組和鏈表
  • 鏈表
  • 對比
  • 總結

一、數組和鏈表

數組:
數組會在內存中開闢一塊連續的空間存儲數據,這種存儲方式有利也有弊端。當獲取數據的時候,直接經過下標值就能夠獲取到對應的元素,時間複雜度爲O(1)。可是若是新增或者刪除數據會移動大量的數據,時間複雜度爲O(n)數組的擴容機制是:若是數組空間不足,會先開闢一塊新的空間地址,將原來的數組複製到新的數組中。java

鏈表:
鏈表不須要開闢連續的內存空間,其經過指針將全部的數據鏈接起來。新增或者刪除的時候只須要將指針指向的地址修改就好了,時間複雜度爲O(1)。可是查詢的時間複雜度爲O(n)redis

二、鏈表

2.一、雙向鏈表數組

雙向鏈表是各個節點之間的邏輯關係是雙向的。
雙向鏈表中節點的組成是:prior: 指向當前節點的前置節點,data:當前節點存儲的數據。next:指向當前節點的後置節點。性能

2.二、壓縮鏈表ui

  • 壓縮鏈表是爲了節約內存開發的。
  • ziplist是一個特別的雙向鏈表,沒有維護雙向指針prev next;反而是存儲上一個entry的長度和當前entry長度,經過長度推算出下一個元素在什麼地方。
  • 犧牲讀取的性能,得到高效的存儲空間,由於存儲指針比存儲entry長度更費內存,這就是典型的時間換空間。

2.三、quicklist鏈表指針

  • 官網介紹:
A doubly linked list of ziplists
    A generic doubly linked quicklist implementation
  • 介紹:
    quicklist是一個雙向鏈表,而且是一個ziplist的雙向鏈表,ziplist自己是一個維持數據項前後順序的列表,並且數據項保存在一個連續的內存塊種。

三、對比

3.一、雙向鏈表code

  • 雙端鏈表便於在表的兩端進行push和pop操做,可是它的內存開銷比較大。
  • 雙端鏈表每一個節點上除了要保存的數據以外,還要額外保存兩個指針。
  • 雙端鏈表的各個節點是單獨的內存塊,地址不連續,節點多了容易產生內存碎片。

3.二、壓縮列表blog

  • ziplist因爲是一塊連續的內存,因此存儲效率很高。
  • ziplist不利於修改操做,每次數據變更都會引起一次內存的realloc。
  • 當ziplist長度很長的時候,一次realloc可能會致使大批量的數據拷貝,進一步下降性能。

3.三、quicklist鏈表ip

  • 空間效率和時間效率的折中。
  • 結合了雙端鏈表和壓縮列表的優勢。

四、總結

redis 3.2版本以前使用的是 雙向鏈表和壓縮鏈表 兩種,由於雙向鏈表佔用的內存要比壓縮鏈表高,因此建立鏈表時首先會建立壓縮鏈表,在合適的時機會轉化成雙向鏈表redis 3.2以後使用的是quicklist鏈表內存

相關文章
相關標籤/搜索