Boltdb原始碼分析(四) bucket結構

2021-08-18 16:02:15 字數 3278 閱讀 8850

boltdb是乙個純粹的key value資料庫,其宗旨是提供乙個簡單,快速,可信的資料庫。此資料庫廣泛應用於各大開源元件中。

前面文章已經講解了

page結構 boltdb原始碼分析(一)-------page結構

node結構boltdb原始碼分析(二)----node結構

meta結構boltdb原始碼分析(三)----meta結構

本文分析bucket結構

由於bucket和其他很多東西有關聯。所以這裡有幾個概念,把這些結構串起來。

先是最底層的磁碟檔案,其結構為一維結構。最小的管理單位是page,將檔案按照page大小分割成塊。

然後將檔案對應的page對映到記憶體中,是這樣的乙個二維地圖。meta是入口,其中有資料的root部分。node是乙個樹形結構,其中有分支節點,有葉子節點。

然後每個node有著不同的屬性,是保持key value的,還是保持bucket(表頭)。

然後才是bucket結構。boltdb,針對每次的操作(讀或寫)的事務,都會有一次bucket的探索過程。 

假設我們要去讀乙個key所對應的value

先從meta的root中,獲取到對應的bucket。然後紅色框中,bucket的乙個探索過程,是通過游標cursor來尋找的,cursor表示探索的當前位置,直到cursor定位到所在的位置。這裡的位置就是node。

這裡可以很形象的比喻下。

1、磁碟檔案就是乙個以page為單位塊的一維空間。

2、記憶體中通過page---》node的對映,然後node通過樹形結構鏈結起來,形成了乙個二維的樹結構。其中meta為特殊的page,為整個資料的入口。

3、現在有了node的樹形地圖。需要對樹進行操作,讀或寫。就需要來一次探索過程。其中bucket就是乙個過程,其中bucket的探索定位是通過游標cursor來實現的。

那麼下面看**:

其中

root     pgid   // page id of the bucket's root-level page

root就是bucket所在的根

tx       *tx                // the associated transaction

事務,每一次對資料庫的操作是一次事務,每次事務都是一次探索定位,修改或讀取資料

過程buckets  map[string]*bucket // subbucket cache

探索過程中,快取記錄下已經探索過的buckets

nodes    map[pgid]*node     // node cache

探索過程中,快取記錄下已經探索過的node

初始化。這裡面只是初始化了tx。

另外這裡根據是否是讀操作還是寫操作,來初始化buckets和nodes

我們看下如何設定root,這個是tx裡面的**。紅色框中,顯示了bucket的root是從meta root中獲取的。

因為bucket是可以巢狀的,也就是說bucket中,不僅僅可以包含key value資料,也可以巢狀包含bucket。

那麼下面一步一步分析

要建立乙個bucket

1、通過游標進行查詢,查詢到所對應key的node資料結構。

2、找到了,對應的node結構是不是bucket型別,是則返回,已經存在的err。否則就型別不匹配err

3、沒有找到,則建立乙個bucket。並將rootnode初始化為isleaf

其中bucket.write是將bucket結構資料生成page記憶體資料

4、然後將寫入到node中

這裡面就將bucket的頭部dump到了page中。

n.write(p)
就是node資料的dump

然後回到函式createbucket中

c.node().put(key, key, value, 0, bucketleafflag)
這裡將bucket所對應的node結構資料放到游標所對應的node中。

上面是查詢bucket。

1、看看buckets快取記錄中有沒有,有,則直接返回

2、通過游標查詢定位。

3、判斷型別是否匹配

4、查詢到後,要做一次轉化成bucket。並將其放入到buckets記錄快取中。

5、最後返回

以上就是將查詢到的value資料轉換成bucket型別。

以上是對bucket的建立和讀取。

下面是對key value的讀寫

put寫

這是設定key value。還是通過游標查詢key所在的node,然後判斷node型別,型別不對的話是會返回err的。

最後是將key value寫入到node中。

get讀

直接通過游標查詢,這個很簡單。

龔浩華月牙寂道長

qq 29185807

2023年04月12日

uC OS II原始碼分析(四)

核心結構 1,臨界區,os enter critical 和os exit critical 為了處理臨界區 必須關中斷,等處理完畢後,再開中斷。關中斷可以避免其他任務或中斷進入臨界區 uc os ii 定義了這兩個巨集來實現,但注意一條 呼叫 uc os ii 功能函式時,中斷應該總是開著的。1 ...

gSOAP 原始碼分析 四

gsoap 原始碼分析 四 2012 6 2 邵盛松 前言本文主要說明gsoap中對client的認證分析 gsoap中包含了http基本認證,ntlm認證等,還可以自定義soap heard實現認證等 一 http基本認證 client在向server傳送請求時提供以使用者名稱和口令形式的憑證 g...

uC OS II原始碼分析(四)

核心結構 1,臨界區,os enter critical 和os exit critical 為了處理臨界區 必須關中斷,等處理完畢後,再開中斷。關中斷可以避免其他任務或中斷進入臨界區 uc os ii 定義了這兩個巨集來實現,但注意一條 呼叫 uc os ii 功能函式時,中斷應該總是開著的。1 ...