加速leveldb查詢性能之Cache技術

加速leveldb查詢性能之Cache技術

目錄

  • 1.兩種Cache

  • 2.Table Cache

  • 3.Block Cache

注:本節所有內容更新至星球。

學習本節之前最好提前需要學習前面兩篇文章,這樣便好理解本節內容。

多圖文講解leveldb之SST/LDB文件格式

【深入淺出leveldb】LRU與哈希表

1.兩種Cache

在leveldb中有兩種cache,分別table cache與block cache,這兩個都是cache但不一樣。

table cache是用來緩存sstable的文件描述符、index block、meta block等信息。

block cache是緩存解壓后的data block。

兩者相同點都是基于前面一節講的ShardedLRUCache實現。

維度Block CacheTable Cache
緩存內容

數據塊(存儲實際鍵值對)

SSTable元數據(索引、文件句柄等)

優化目標

減少磁盤I/O和重復解壓

減少文件打開和元數據解析開銷

生命周期

隨數據塊訪問頻率動態更新

隨SSTable文件的訪問頻率更新

配置參數Options.block_cacheOptions.max_open_files

通常來說一個block的大小在4K ~ 4MB之間,block cache默認是一個8MB的LRU cache。

table cache默認的文件數是990(可以理解為990個sstable文件或索引(data block index)),還保留十個左右的文件用于其他用途,并將其余990個文件交給 TableCache。

假設查詢鍵K

  1. Table Cache幫助快速定位KSSTable-XBlock 5

  2. Block Cache若已緩存Block 5,則直接讀取;否則從磁盤加載Block 5并緩存。

  3. 整個過程避免了重復打開SSTable-X文件和解壓Block 5的開銷。

通過這種分層緩存設計,LevelDB在有限內存下顯著提升了讀取效率。

下面來講一下這兩塊的實現。

2.Table Cache

開始是在DBImpl構造函數時創建table cache:

new?TableCache(dbname_, options_, TableCacheSize(options_)

此時會通過NewLRUCache緩存990個文件。

lru cache中的kv分別是:

  • k = file name(壓縮之后)

  • v = TableAndFile

struct?TableAndFile?{RandomAccessFile* file; ?// 已打開的文件句柄Table* table; ? ? ? ? ? ?// 對應的 SSTable 解析結構
};char?buf[sizeof(file_number)];
EncodeFixed64(buf, file_number);
Slice?key(buf,?sizeof(buf));
TableAndFile* tf =?new?TableAndFile;
tf->file = file;
tf->table = table;
*handle = cache_->Insert(key, tf,?1, &DeleteEntry);

核心接口有4個,分別是:

1.Evict

刪除這個文件的緩存

2.FindTable

比如現在要打開某一個sstable,通過table cache可以快速拿到sstable的索引/filter,隨后快速查詢data block數據。

這里其實就是對lru的操作:

  • k = 壓縮的file_name不存在,打開sstable文件,并緩存下來,此時會在table cache的lru中寫入<k = 壓縮的 filename, v = TableAndFile>

  • 如果k是直接在緩存中,直接從lru中拿到handle,隨后從handle拿到 value就是TableAndFile。

Status?TableCache::FindTable(uint64_t?file_number,?uint64_t?file_size,Cache::Handle** handle)?{}

3.Get

Get接口用來查詢某個key在不在sstable中,如果在回調處理函數;不在返回即可。

所以 Get函數第一步調用FindTable拿到緩存的handle,然后從TableAndFile中拿到table,調用其接口InternalGet,隨后釋放這個handle。

InternalGet的實現步驟如下:

  • 先通過data block index 看看這個key在不在

  • 在的話在打開拿到了對應data block的handle

    • 然后通過filter來查,不在的話直接返回不存在

    • 存在的話再通過BlockReader拿到這個block并構造出iter

    • 然后iter定位到key,找到調用回調處理即可。

4.NewIterator

根據key=file_name查找cache,并返回這個cache與基于這個cache創建的iterator。

2.Block Cache

block cache是在讀取真正的data block的時候使用,函數是BlockReader。

根據輸入的索引數據(二進制),解析為對應data block的block handle,此時去看options有沒有設置block_cache,如果沒有直接ReadBlock,否則從block_cache中查詢key是一個16字節,具體來說:

key = 8字節id + block的offset

value = Block

所以這里查詢的時候,能查找到就拿到Block,否則ReadBlock之后寫入cache。

if?(cache_handle !=?nullptr) {block =?reinterpret_cast<Block*>(block_cache->Value(cache_handle));
}?else?{s = ReadBlock(table->rep_->file, options, handle, &contents);if?(s.ok()) {block =?new?Block(contents);if?(contents.cachable && options.fill_cache) {cache_handle = block_cache->Insert(key, block, block->size(),&DeleteCachedBlock);}}
}

本節完

學習更多干貨,歡迎關注轉發!

圖片

圖片

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81010.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81010.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81010.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

5.2.3 使用配置文件方式整合MyBatis

本實戰通過使用Spring Boot和MyBatis技術棧&#xff0c;實現了文章列表顯示功能。首先&#xff0c;通過創建ArticleMapper接口和對應的ArticleMapper.xml配置文件&#xff0c;實現了對文章數據的增刪改查操作&#xff0c;并通過單元測試驗證了功能的正確性。接著&#xff0c;通…

Node.js 源碼架構詳解

Node.js 的源碼是一個龐大且復雜的項目&#xff0c;它主要由 C 和 JavaScript 構成。要完全理解每一部分需要大量的時間和精力。我會給你一個高層次的概述&#xff0c;并指出一些關鍵的目錄和組件&#xff0c;幫助你開始探索。 Node.js 的核心架構 Node.js 的核心可以概括為以…

【NLP 76、Faiss 向量數據庫】

壓抑與痛苦&#xff0c;那些輾轉反側的夜&#xff0c;終會讓我們更加強大 —— 25.5.20 Faiss&#xff08;Facebook AI Similarity Search&#xff09;是由 Facebook AI 團隊開發的一個開源庫&#xff0c;用于高效相似性搜索的庫&#xff0c;特別適用于大規模向…

Go 語言簡介

1. Go 語言簡介 1.1 什么是 Go 語言 Go語言&#xff0c;通常被稱為Golang&#xff0c;是由Google在2007年開始開發&#xff0c;并在2009年正式發布的一種開源編程語言。Go語言的設計初衷是解決大型軟件開發中的效率和可維護性問題&#xff0c;特別是在多核處理器和網絡化系統…

VMware虛擬機突然無法ssh連接

遇到的情況&#xff1a; 功能全部正常的情況下&#xff0c;沒有修改任何配置&#xff0c;重啟電腦之后無法ssh連接 其實不太可能的可能原因&#xff1a; 1、虛擬機內部sshd服務未運行 systemctl status sshd systemctl start sshd 2、檢查SSH端口監聽 netstat -an | grep :…

[ 計算機網絡 ] | 宏觀談談計算機網絡

&#xff08;目錄占位&#xff09; 網絡間通信&#xff0c;本質是不同的兩個用戶通信&#xff1b;本質是兩個不同主機上的兩個進程間通信。 因為物理距離的提升&#xff0c;就衍生出了很多問題。TCP/IP協議棧 / OSI七層模型&#xff0c;將協議分層&#xff0c;每一層都是為了…

Oracle 11g導出數據庫結構和數據

第一種方法&#xff1a;Plsql 利用plsql可視化工具導出&#xff0c;首先根據步驟導出表結構&#xff1a; 工具(Tools)->導出用戶對象(export user objects)。 其次導出數據表結構&#xff1a; 工具(Tools)->導出表(export Tables)->選中表->sql inserts(where語…

跟Gemini學做PPT:匯報背景圖尋找指南

PPT 匯報背景圖尋找指南 既然前端功能已經完善&#xff0c;現在可以專注于匯報了。對于 PPT 背景圖&#xff0c;你有幾個選擇&#xff1a; 1. 內置模板和主題&#xff1a; 優點&#xff1a; 最簡單、快速&#xff0c;PowerPoint、Keynote、Google Slides 等演示軟件都內置了…

【Hadoop】大數據技術之 HDFS

目錄 一、HDFS 概述 1.1 HDFS 產出背景及定義 1.2 HDFS 優缺點 1.3 HDFS 組成架構 1.4 HDFS 文件塊大小 二、HDFS 的Shell 操作 三、HDFS 的讀寫流程&#xff08;面試重點&#xff09; 3.1 HDFS 寫數據流程 3.2 HDFS 讀數據流程 四、DataNode 4.1 DataNode 的工作機制…

Spring Boot WebFlux流式返回全攻略:從基礎到企業級實踐

目錄 流式返回的核心價值與適用場景WebFlux核心機制解析基礎流式接口開發實戰企業級應用場景與優化方案客戶端對接全方案常見問題與調優策略未來發展趨勢1. 流式返回的核心價值與適用場景 1.1 傳統響應模式的局限性 傳統Spring MVC采用同步阻塞模型,在以下場景面臨挑戰: 大…

AI浪潮下,第五消費時代的商業進化密碼

解鎖 AI 與第五消費時代 在時代的長河中,消費浪潮的更迭深刻地影響著商業的格局。當下,我們正處于第五消費時代,這個時代有著鮮明的特征,如老齡化、單身化趨勢日益顯著,社會逐漸步入低欲望、個性化與共享化并行的階段 。隨著人工智能技術的飛速發展,它在商業領域的滲透也…

氫氣傳感器維護常見問題及解決方法

氫氣傳感器在工業生產和氫能源系統中扮演著關鍵角色&#xff0c;用于實時檢測氫氣濃度以預防爆炸和中毒事故。然而&#xff0c;傳感器的維護過程中可能會遇到一些常見問題&#xff0c;這些問題可能會影響傳感器的性能和檢測準確性。本文將詳細探討這些常見問題及其解決方法。 1…

【普及+/提高】洛谷P2613 ——【模板】有理數取余

見&#xff1a;P2613 【模板】有理數取余 - 洛谷 題目描述 給出一個有理數 cba?&#xff0c;求 cmod19260817 的值。 這個值被定義為 bx≡a(mod19260817) 的解。 輸入格式 一共兩行。 第一行&#xff0c;一個整數 a。 第二行&#xff0c;一個整數 b。 輸出格式 一個整…

RK常見系統屬性設置/獲取命令使用

設置有線mac地址 ifconfig eth0 hw ether 021234567000 讀取mac地址 public static String getEthMacAddressBySysFs() { try (BufferedReader reader new BufferedReader(new FileReader("/sys/class/net/eth0/address"))) { return reader.r…

文章記單詞 | 第115篇(六級)

一&#xff0c;單詞釋義 solar /?so?l?r/ adj. 太陽的&#xff1b;太陽能的bruise /bru?z/ n. 瘀傷&#xff1b;擦傷 v. &#xff08;使&#xff09;青腫&#xff1b;挫傷thus /?s/ adv. 因此&#xff1b;這樣&#xff1b;于是drink /dr??k/ v. 喝&#xff1b;飲 n. 飲…

9大開源AI智能體概況

項目GitHub 鏈接開發組織核心功能應用領域典型應用案例活躍度AutoGPT (176k?)鏈接Significant Gravitas 團隊基于 GPT-4 的自主代理&#xff0c;能夠自動分解任務并生成多步提示循環執行&#xff0c;支持調用工具&#xff08;如網絡搜索、文件操作等&#xff09;。自動化辦公、…

SpringBoot3整合WebSocket

一、WebSocket簡介 WebSocket協議是基于TCP的一種新的網絡協議。它實現了瀏覽器與服務器全雙工(full-duplex)通信&#xff0c;允許服務器主動向客戶端推送數據。 與傳統的 HTTP 請求-響應模式不同&#xff0c;WebSocket 在建立連接后&#xff0c;允許服務器和客戶端之間進行雙向…

FTP Bounce Attack:原理、影響與防御

一、引言 FTP&#xff08;文件傳輸協議&#xff09;是一種用于在網絡上進行文件傳輸的協議&#xff0c;廣泛應用于各種網絡環境中。然而&#xff0c;FTP協議的安全性問題一直備受關注&#xff0c;其中FTP Bounce Attack&#xff08;FTP跳轉攻擊&#xff09;是一種具有代表性的…

文獻閱讀——NeuroBayesSLAM

原文地址 1.核心理論&#xff1a;貝葉斯多感官整合框架 目標&#xff1a;結合視覺線索 c v i c_{vi} cvi?和前庭線索 c v e c_{ve} cve?來估計頭部方向或位置 θ 貝葉斯公式 p ( θ ∣ c v i , c v e ) ∝ p ( c v i ∣ θ ) p ( c v e ∣ θ ) p ( θ ) p(\theta | c_{vi…

sentinel核心原理-高頻問題

核心原理 ?限流實現機制? ?滑動窗口算法?&#xff1a;將時間切分為子窗口動態統計QPS&#xff0c;避免固定窗口的邊界問題。?責任鏈模式?&#xff1a;通過NodeSelectorSlot、FlowSlot等Slot鏈式處理限流邏輯。 ?熔斷降級策略? ?慢調用比例?&#xff1a;當慢請求比例…