1. 程式人生 > >[Redis] redis的設計與實現-對象系統

[Redis] redis的設計與實現-對象系統

通過 字符串 有序集合 時長 都是 tab bbb 字節 大於

1.redis並沒有直接使用前面的數據結構實現鍵值對數據庫,而是基於數據結構創建了一個對象系統,字符串對象/列表對象/哈希對象/集合對象/有序集合對象都用到了至少一種前面的數據結構
2.針對不同的使用場景,為對象設置多種不同的數據結構實現,從而優化對象在不同場景下的使用效率
3.redis的對象系統實現了基於引用計數的內存回收機制,通過引用計數實現了對象共享機制,多個鍵共享同一個對象節約內存
4.redis對象帶有訪問時間記錄信息,會計算鍵的空轉時長,開啟maxmemory下會優先刪除長的
5.創建一個鍵值對時,至少創建兩個對象,鍵對象和值對象redisObject結構定義,type屬性記錄了對象的類型,用type命令的時候返回的是值對象的類型
6.redisObject結構的ptr屬性,指向對象的底層數據結構,encoding屬性encoding屬性決定了該對象使用哪個底層數據結構(整數/簡單動態字符串/字典/雙端鏈表/壓縮列表/整數集合/跳躍表和字典),object encoding命令可以查看值對象的編碼
7.列表對象在元素比較少時使用壓縮列表,比較多時使用雙端鏈表
9.字符串對象可以是int,raw(簡單動態字符串),embstr(embstr編碼的簡單動態字符串),long類型的整數存的是時候是int;小於32字節的是embstr,大於的是raw
10.列表對象可以是ziplist(壓縮列表)和linkedlist(雙端鏈表),列表對象保存的所有字符串元素的長度都小於64字節和元素數量小於512個時使用ziplist
rpush book "aaaaaaaaaaaaaa" "bbbbbbbbbbb"等進行測試
11.哈希對象的編碼可以是ziplist或者hashtable;當使用ziplist編碼時,當有新的鍵值對加入到哈希對象,先把鍵壓入壓縮列表,再把值壓入壓縮列表
12.當使用hashtable編碼的哈希對象,使用字典作為底層實現,哈希對象中的每個鍵值對都使用字典的鍵值對保存
13.哈希對象保存的所有鍵值對的鍵和值字符串長度都小於64字節,保存鍵值對的數量小於512個,使用ziplist編碼,否則使用hashtable編碼
14.哈希對象中鍵的長度太大或者值的長度太大都會引起編碼轉換,使用object encoding key可以觀察到
hset book aaaaaaaaaaa_name "aa"等進行測試
15.集合對象的編碼可以是intset或者hashtable,intset的集合對象使用整數集合作為底層,當元素數量不超過512個,所有元素都是整數的時候;hashtable編碼的使用字典作為底層實現,字典的鍵是字符串對象,字典的值是null;不能重復,不保證順序,保證數據唯一
16.有序集合的編碼是ziplist和skiplist,壓縮列表的集合元素按分值從下到大進行排序,使用ziplist編碼的,第一個節點保存元素的成員,第二個節點保存元素的分值;skiplist底層使用zset結構同時包含一個字典和一個跳躍表,對有序集合的範圍操作比如zrank,zrange是通過跳躍表實現;取給定成員的分值,是通過字典實現的
保存元素小於128個,所有成員長度小於64字節的使用ziplist,其他使用skiplist

[Redis] redis的設計與實現-對象系統