05 Redis的記憶體物件及內部編碼 List

2021-10-04 10:02:47 字數 1175 閱讀 6585

列表(list)用來儲存多個有序的元素; 乙個列表可以儲存2^32-1個元素。

redis中的列表支援兩端插入和彈出,並可以獲得指定位置(或範圍)的元素,可以充當陣列、佇列、棧等。

1 內部編碼列表的內部編碼可以是壓縮列表(ziplist)或雙端鍊錶(linkedlist)

/* node, list, and iterator are the only data structures used currently. */

/* * 鍊錶節點

*/typedef

struct listnode listnode;

鍊錶如下定義:

/* 

* 鍊錶

*/typedef

struct list list;

雙端鍊錶結構如下圖所示:

通過圖中可以看出,雙端鍊錶同時儲存了表頭指標和表尾指標,並且每個節點都有指向前和指向後的指標;鍊錶中儲存了列表的長度;dup、free和match為節點值設定型別特定函式,所以鍊錶可以用於儲存各種不同型別的值。而鍊錶中每個節點指向的是type為字串的redisobject。

如圖,如果有乙個指標p指向該壓縮列表,則尾巴節點的長度就是指標加上偏移量179(十六進製制0xb3=16*11+3=179),列表的長度zllen為5,表示壓縮列表包含5個節點。zlbytes為0xd2表示壓縮列表的總長為210位元組。

由上可知,每個壓縮列表的節點可以儲存乙個位元組陣列或者乙個整數值,那麼每個節點肯定也有自己的結構。

與雙端鍊錶相比,壓縮列表可以節省記憶體空間,但是進行修改或增刪操作時,複雜度較高

因此當節點數量較少時,可以使用壓縮列表;但是節點數量多時,還是使用雙端鍊錶划算

壓縮列表不僅用於實現列表,也用於實現雜湊、有序列表;使用非常廣泛。

04 Redis的記憶體物件及內部編碼 String

redis支援5種物件型別,而每種都至少有兩種編碼,這樣做的好處在於 一方面介面與實現分離,當需要增加或改變內部編碼時,使用者使用不受影響 另一方面可以根據不同的應用場景切換內部編碼,提高效率。redis各種物件型別支援的內部編碼如下圖所示 部分 關於redis內部編碼的轉換,都符合以下規律 編碼轉...

Redis記憶體淘汰策略及Key的過期策略

volatile lru 淘汰最近最少使用的 volatile random 隨機淘汰 volatile ttl 淘汰將要到期的 allkeys random 所有key中隨機淘汰 allkeys lru 所有key中淘汰最近最少使用的 預設的淘汰策略 no enviction enviction譯...

Java物件的記憶體分配及初始化

public class square public class testsquare 1.程式開始執行時,testsquare被類載入器載入進入記憶體,main方法由於是static方法首先pop到棧中 2.接著就是new square 類載入器載入square類,對類中的成員變數和方法進行初始化...