dict是乙個維護k-v對映關係的資料結構,與map相似,旨在解決查詢問題。
dict優點主要在於rehash。
dict包含2個hash表ht[0]和ht[1],0用於平時使用,而1用於rehash。
dict的rehash是漸進性進行的,一種是按照時間(每次執行乙個固定的時間)、一種是按照索引值(一次移動乙個索引下的kv)。
漸進式的rehash使得其對dict的增刪改查效率影響較小。
dict的增刪查操作:
增和改:效率低?
未rehash時 加入hash表0。
rehash時 加入hash 1
刪和查:
未rehash 查詢0
rehash時 先找0 再找1。
sds是redis中的字串結構。
sds結構主要包含乙個陣列存放字串、free記錄陣列未使用位元組、len記錄陣列已使用長度
sds優勢:
1、o1複雜度的獲取字串長度 --sds裡的len變數
2、杜絕快取區溢位–sds的自動檢測及擴充套件功能
3、減少記憶體重分配次數–sds的預分配功能(擴充套件時額外分配已使用長度的未使用空間)和惰性空間釋放(字串縮短時釋放的空間不會立馬釋放)
4、二進位制安全–sds的len變數判斷結尾而不是c的空格
5、相容c–sds仍會在字串結尾加上乙個空格
一種特殊的雙向鍊錶。
特殊性:記憶體位址連續、可變長度的編碼方式。
新增或刪除可能引起連鎖的更新操作--可變長度的編碼方式。
一種結合list和ziplist的鍊錶
draw.io evaluation version
ziplist
ziplist
ziplist
每個節點由乙個ziplist實現。主要客服ziplist由於記憶體連續而引起的插入操作大幅度移動的缺點。
相關引數設定:
list-max-ziplist-size -2
list-compress-depth 0
跳躍表:有序/查詢速率媲美平衡樹。
整數集合:儲存數量不多且不重複的整數
特點:公升級特性,當新加入的資料長度大於已有資料的長度時,intset會進行公升級,增大儲存資料的位數(16-32-64)。
優點:節省記憶體。
robj是乙個用來表示value資料型別的通用詩句結構
robj欄位:
type:物件的資料型別 4bit,5種取值。(string、list、set、zset、hash)
encode:物件內部的表示方式,4bit,10種取值
type
encode
obj_string
obj_encoding_raw:string使用sds表示
obj_encoding_int:string為數字使用long表示
obj_encoding_embstr:嵌入式sds 32位元組
obj_list
redis_encoding_ziplist:ziplist
redis_encoding_linkedlist:(以棄用)
obj_encoding_quicklist
obj_set
redis_encoding_ht:dict
redis_encoding_intset:(數量小且全為整數)intset
obj_zset
redis_encoding_ziplist:ziplist(數量與長度較小)
redis_encoding_skiplist skiplist
obj_hash
redis_encoding_ziplist:ziplist(體量較小時)
redis_encoding_ht:dict
sds與嵌入式sds區別
建立sds的字串需要呼叫2次記憶體
分別建立redisobject和sdshdr,而嵌入式sds只需要一次
建立和釋放都訪問一次記憶體,
嵌入式sds是連續的記憶體區域
32位元組以內使用嵌入式sds
redis版本3.29 實測字串長度為45時才會開始使用sds
redis基礎結構 DICT
redis字典具dd有以下特點 字典 每個字典使用兩個雜湊表,用於實現漸進式 rehash typedef struct dict dict 雜湊表 typedef struct dictht dictht 雜湊表節點 typedef struct dictentry v 鏈往後繼節點 建立乙個比 ...
Redis 基礎資料結構
基礎資料型別 5種 string 字串 hash 雜湊 list 列表 set 集合 zset 有序集合 set key name value 命令用於設定給定key的值,如果key已經儲存其它值,則會覆蓋舊值,且與型別無關 get key name 命令用於獲取指定key的值,如果key不存在,則...
Redis 基礎資料結構
redis有5種基礎資料結構,分別是 string list hash set zset。1 string 字串 字串string是redis最簡單的資料結構,內部表示的就是乙個字元陣列。儲存值 set key value 獲取值 get key redis可以對多個字串進行批量讀寫。批量儲存 ms...