redis hashmap資料結構

2021-08-18 11:25:48 字數 1307 閱讀 9503

一、描述

redis的其中乙個資料型別為hashmap,即雜湊表

正常實現hashmap:

1.分配固定大小的桶,大小為n

2.計算key的hash值,並且與n取模,得到在桶的索引位置index

3.根據2中計算的index,然後存放在對應的桶中

4.當遇到碰撞情況,則會通過鍊錶來解決碰撞問題

二、redis中資料結構定義

struct dictht:為hash table的實際實現結構

struct dict:為hash table的外層封裝,主要乙個作用是當當前使用dictht需要進行rehash的時候,其會建立新的dictht,並且會在詞請求的時候,完成一部分的搬運工作

struct dictentry:為每個桶,其中的next為解決衝突的鍊錶

三、rehash:

redis的雜湊表和正常的雜湊表實現沒有太大區別,唯一的區別是在rehash-即需要重新擴容的情況有所區別

正如我們所知,redis是單程序單執行緒模式,那麼對於rehash如果一次性完成資料的搬運的,在資料量大的時候,會是

很耗時的操作,因此redis並不是一次性搬運完所有的資料,而是在每次請求的時候,都會觸發搬運工作,

但是搬運的資料都是一小部分而已。

1.lazy rehash,每次操作dict的時候,會搬運乙個slot到新的hashmap

2.active rehash,每過一段時間便會進行資料的搬運

四、小點:

在使用hashmap的時候,並不是說每次redis都會直接用雜湊表的方式來儲存資料,因此在單獨使用key-value,value作為hashmap使用的時候,

很可能只是用於存放簡單而且少量的資料,因此處於對記憶體消耗和效能等綜合考量,在一開始redis會通過ziplist(壓縮雙向鍊錶來儲存資料)相關鏈結。

而控制什麼時候會採用hashmap來儲存,可以通過引數來控制:

hash-max-ziplist-entries 512(ziplist最大儲存entry的數量)

hash-max-ziplist-value 64(ziplist最大乙個entry儲存的位元組數)

凡是超過這兩個限制,都會講ziplist轉換為hashmap

clickhouse insert的資料結構

clickhouse insert大致分為兩部分 1.sql語句部分 insert into table f1,f2 2.資料部分資料部分又分為3部分 頭,資料,尾 資料頭 資料塊1 資料塊2 資料塊n 資料尾從中可以看出 每個insert可以包含多個資料塊,每個資料塊可以包含多行。乙個完整的ins...

資料結鍊錶

1.為什麼需要雙向鍊錶 2.雙向鍊錶刪除節點的3種情況 結論 在雙向鍊錶中插入元素時,使用3個指標變數,實現插入操作 注意 在刪除元素時,通過next null 判斷是否只有乙個業務節點 及判斷是否在鍊錶的0號位置 要特殊處理這兩中情況,避免異常。3.迴圈鍊錶的插入情況 4.迴圈鍊錶的刪除的幾種情況...

Opencv Python API 基本資料結構

本例使用python3.7 opencv環境配置方法 pip install numpy matplotlib 構造2 行 4列 全是0的uchar型別的二維陣列import numpy as np z np.zeros 2 4 np.uint8 type z zarray 0,0,0,0 0,0,...