当前位置: 首页 > wzjs >正文

常熟做网站价格室内设计平面图素材

常熟做网站价格,室内设计平面图素材,备案网站建设方案书范文,贵州网站设计文章摘要 LevelDB的日志管理系统是怎么通过双链表来进行数据管理为什么LevelDB能够在不锁表的情况下进行日志新增 适用人群: 对版本管理机制有开发诉求,并且希望参考LevelDB的版本开发机制。数据库相关从业者的专业人士。计算机狂热爱好者,对计算机的…

文章摘要

  1. LevelDB的日志管理系统是怎么通过双链表来进行数据管理
  2. 为什么LevelDB能够在不锁表的情况下进行日志新增

适用人群:

  1. 对版本管理机制有开发诉求,并且希望参考LevelDB的版本开发机制。
  2. 数据库相关从业者的专业人士。
  3. 计算机狂热爱好者,对计算机的存储机制有强烈技术追求的同志。

阅读建议:

  1. 作者本人功底有限不太可能考虑到所有读者的阅读细节,建议读者先通盘阅读下本文,先熟悉本文中会出现哪些关键概念和关键流程,并配合上AI工具对文章中个别流程进行细致理解。

LevelDB版本管理机制

核心抽象

在这里插入图片描述
主要分为

  1. 版本管理层:版本抽象相关的操作和逻辑。
  2. 文件管理层: 主要和文件磁盘上的物化数据打交道。
  3. 快照管理层:依托快照对外暴露固化查询的服务。
抽象职能
Version版本管理的最小单位,维护特定时刻的数据库状态,管理文件集合
VersionSet版本集合管理器,负责管理所有版本,维护当前版本,处理版本切换
VersionEdit版本变更记录,记录版本间的差异,支持变更的序列化和反序列化
Builder版本构建器,负责构建新版本,应用版本变更
Compaction压缩任务管理,处理文件压缩,生成新的版本变更
FileMetaData文件元数据,记录文件的基本信息(大小、范围等)
Manifest清单文件管理,持久化版本信息,支持数据库恢复
Snapshot数据库某一时刻的快照,提供一致性读取视图,基于序列号实现
SnapshotList快照列表管理,维护所有活跃的快照,管理快照的生命周期

这里面的重点是:

  • Version是整个版本管理机制的最小单元抽象
  • compaction 的机制非常复杂,本文不赘述,感兴趣移步: [LevelDB]揭秘LevelDB暗藏的合并秘技,Compaction内部的超神操作让工程师都惊呆了!

版本管理层(Version)核心逻辑

在这里插入图片描述

  1. 客户端向VersionSet抽象请求版本变更操作
  2. VersionSet 通过创建VersionEdit来记录一些当前操作的变更
  3. 使用Build模式来创建新版本并更新当前的版本

亮点设计:

  1. 使用新建Version的方式来实现无锁读取,简化并发控制。
  2. 使用Builder(构建者模式)来进行构建,对代码进行解耦。
  3. 使用VersionEdit进行增量更新,并且能够通过VersionEdit来进行日志记录。

源代码细节说明

客户端(通常理解是应用LevelDB的机器)调用LevelDB的LogAndApply接口来进行版本新增

// 调用入口
s = versions_->LogAndApply(&edit, &mutex_);

简单来说,就是生成一个新的版本Version,并添加到当前的版本管理链表中。
在这里插入图片描述
LogAndApply方法主要有以下的核心阶段(流程图见下文

  • 初始化一些必要参数,如log_number_(日志编号: 用于后续清理WAL无用日志), file_number(文件编号-用于实现文件的唯一性),Sequence(用于实现序列号唯一性)
    在这里插入图片描述
    源码参考:
  // 日志版本号-用于实现WAL 预写入机制-用于清理当时用不了的文件if (edit->has_log_number_) {assert(edit->log_number_ >= log_number_);assert(edit->log_number_ < next_file_number_);} else {edit->SetLogNumber(log_number_);}if (!edit->has_prev_log_number_) {edit->SetPrevLogNumber(prev_log_number_);}// file_number 文件编号-用于实现文件的唯一性  // sequence: 用于控制序列唯一性edit->SetNextFile(next_file_number_);edit->SetLastSequence(last_sequence_);
  • 构建新版本(包括对版本的压缩打分)
    在这里插入图片描述
  1. 创建新版本 -亮点: 使用Builder模式来构建新版本
  2. Apply 方法 用于根据edit中的信息来生成对应的build构造器
  3. SaveTo 方法 用于将build构造器中的信息应用到新的version中
  Version* v = new Version(this);{Builder builder(this, current_);builder.Apply(edit);builder.SaveTo(v);}// 计算 最佳压缩层级Finalize(v);
  • MANIFEST处理阶段, 这里的MANIFEST
    在这里插入图片描述
 // MANIFEST 文件处理std::string new_manifest_file;Status s;if (descriptor_log_ == nullptr) {// 日志assert(descriptor_file_ == nullptr);// 底层文件操作new_manifest_file = DescriptorFileName(dbname_, manifest_file_number_);s = env_->NewWritableFile(new_manifest_file, &descriptor_file_);if (s.ok()) {descriptor_log_ = new log::Writer(descriptor_file_);// 写入快照-本质上是向 Manifest 日志中写入当前的文件状态,防止记录丢失s = WriteSnapshot(descriptor_log_);}}
  • 文件同步阶段
    在这里插入图片描述
{mu->Unlock();if (s.ok()) {std::string record;edit->EncodeTo(&record);s = descriptor_log_->AddRecord(record);if (s.ok()) {s = descriptor_file_->Sync();}if (!s.ok()) {Log(options_->info_log, "MANIFEST write: %s\n", s.ToString().c_str());}}if (s.ok() && !new_manifest_file.empty()) {s = SetCurrentFile(env_, dbname_, manifest_file_number_);}// 重新获取锁mu->Lock();}
  • 完成安装阶段
    在这里插入图片描述
// 让基于VersionEdit和老版本if (s.ok()) {// 将新版本添加到版本链表AppendVersion(v);// 更新日志文件号log_number_ = edit->log_number_;prev_log_number_ = edit->prev_log_number_;} else {//  快照写入失败delete v;if (!new_manifest_file.empty()) {// 清理新创建的 MANIFEST 文件相关资源delete descriptor_log_;delete descriptor_file_;descriptor_log_ = nullptr;descriptor_file_ = nullptr;env_->RemoveFile(new_manifest_file);}}return s;
}

猜你喜欢

C++多线程: https://blog.csdn.net/luog_aiyu/article/details/145548529
一文了解LevelDB数据库读取流程:https://blog.csdn.net/luog_aiyu/article/details/145946636
一文了解LevelDB数据库写入流程:https://blog.csdn.net/luog_aiyu/article/details/145917173
关于LevelDB存储架构到底怎么设计的:https://blog.csdn.net/luog_aiyu/article/details/145965328?spm=1001.2014.3001.5502

PS

你的赞是我很大的鼓励
我是darkchink,一个计算机相关从业者&一个摩托佬&AI狂热爱好者
本职工作是某互联网公司数据相关工作,欢迎来聊,内推或者交换信息
vx 二维码见: https://www.cnblogs.com/DarkChink/p/18598402


文章转载自:

http://iLUF7qlB.hsfLq.cn
http://x20fX8o8.hsfLq.cn
http://tQQFPMcb.hsfLq.cn
http://RFmyGAjk.hsfLq.cn
http://tOYINbXl.hsfLq.cn
http://Z5GNMRes.hsfLq.cn
http://jUAkTxN0.hsfLq.cn
http://LqNXHe9c.hsfLq.cn
http://RWgG3jBl.hsfLq.cn
http://g4sdnvUF.hsfLq.cn
http://k0Zz7Dum.hsfLq.cn
http://JOB8v84f.hsfLq.cn
http://SQlCXrQd.hsfLq.cn
http://73dIo8dm.hsfLq.cn
http://WnksNijc.hsfLq.cn
http://UNX04GXT.hsfLq.cn
http://Ngpc2XUZ.hsfLq.cn
http://dOMECCWP.hsfLq.cn
http://WFbnN7r6.hsfLq.cn
http://gE9phHrK.hsfLq.cn
http://c5tEWyzg.hsfLq.cn
http://G8rWG3rP.hsfLq.cn
http://9SZBhFkr.hsfLq.cn
http://HNecYlHj.hsfLq.cn
http://uWGODRaB.hsfLq.cn
http://mwphlCaX.hsfLq.cn
http://rqgkfZn0.hsfLq.cn
http://L4cjXOzs.hsfLq.cn
http://o45E3rQN.hsfLq.cn
http://C92eCvzd.hsfLq.cn
http://www.dtcms.com/wzjs/736879.html

相关文章:

  • wordpress 去掉分类潜江seo
  • 狼雨seo网站排名查询网站免费建站k
  • 网站开发软件有哪些免费吕梁网站制作吕梁安全
  • 浙江汉农建设有限公司网站无锡企业网站制作报价
  • 网站开发行业做网站容易找工作吗
  • wordpress缩略图代码广州seo服务
  • 网站维护需要做网站的是什么
  • 互联网个人用户网站黑马网站建设
  • wdcp 防盗链 网站不能打开浙江备案需要开启网站吗
  • 北京美的网站直接进入网址的浏览器
  • 江苏网站建设银川建设网站
  • 昆明电子商务网站做的好的营销型网站有哪些
  • 手机网站设计尺寸大小百度旗下所有app列表
  • 保定建网站需要多少钱什么样的网站需要icp经营性备案
  • 同城信息网站建设网站建设的公司
  • 源码制作网站教程电脑网站设计制作
  • 销售网站的技巧赣州网站建设哪家好
  • 怎么自己做砍价网站移动端网站优化
  • 集团网站建设网站的构成
  • 景区门户网站建设大数据分析wordpress点击分类目录空白
  • 廊坊网站群建设企业网站备案资料
  • 制作网页与网站wordpress %post_id%
  • 网站建设的经济可行性分析做一个手机网站多少钱
  • 婚纱网站策划书改变wordpress表前缀
  • 网站建设 山东百度知道登录入口
  • 自己做静态网站的步骤新手学做网站pdf手
  • 代刷业务网站建设wordpress写书typecho主题
  • 网站代运营要多少费用哪些人需要建网站
  • 上海高端网站公司哪家好如何做跨境电商需要哪些条件
  • 广州建设行业网站网站建设应该考虑哪些问题