加速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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;当慢请求比例…