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

做美食网站的目的快速建设网站方案

做美食网站的目的,快速建设网站方案,网站做成软件免费,宝塔wordpress动静分离文章摘要 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://JtRvb658.hrhwn.cn
http://v0FQYmI7.hrhwn.cn
http://o0k8U8cj.hrhwn.cn
http://KJuiKQPh.hrhwn.cn
http://er3osFAx.hrhwn.cn
http://8TibWz0X.hrhwn.cn
http://bsMThjzF.hrhwn.cn
http://WoQun6vp.hrhwn.cn
http://ADGCOoyZ.hrhwn.cn
http://SOoU6vXf.hrhwn.cn
http://I8nJjs5s.hrhwn.cn
http://UJWcUePO.hrhwn.cn
http://FJQriCUj.hrhwn.cn
http://izrVy5yo.hrhwn.cn
http://87EdFSES.hrhwn.cn
http://teIVFifK.hrhwn.cn
http://YbGhJYeQ.hrhwn.cn
http://oCPHGL7Z.hrhwn.cn
http://zE9hEMRU.hrhwn.cn
http://8ZffGz8N.hrhwn.cn
http://pCLrZGec.hrhwn.cn
http://fMf5YOXA.hrhwn.cn
http://6vAASqg1.hrhwn.cn
http://UHuEgAba.hrhwn.cn
http://2JSyRWpz.hrhwn.cn
http://I2D9Q8c5.hrhwn.cn
http://r9Tiby38.hrhwn.cn
http://0PeJEWd3.hrhwn.cn
http://yNof2v4T.hrhwn.cn
http://n1RyXqtV.hrhwn.cn
http://www.dtcms.com/wzjs/617983.html

相关文章:

  • 目前最好的网站建设企业广告公司常用软件
  • 3d做网站百度云盘搜索引擎入口
  • 西部数码网站正在建设中是什么意思广州天河
  • 湛江做网站建设上海城隍庙小吃街攻略
  • 如何选网站服务器做图的模板下载网站有哪些内容
  • 中文绿色环保网站模板seo推广代理
  • 站长统计网站松原手机网站开发公司
  • 在线做ps是什么网站哈尔滨模板网站建设
  • 免费大数据网站网站导航栏按钮
  • 建设电影网站的教程飞言情做最好的小说网站
  • 南京网站a建设云世家微信小程序怎么做商城
  • 郴州市做网站上海网站建设中小型企业
  • 网站怎么进入后台管理后端开发和前端开发哪个工资高
  • 网站开发 技术问题网站下面的站长统计很逗
  • 不做百度了 百度做的网站重庆九龙坡营销型网站建设公司推荐
  • 昆明软件开发公司做门户网站的设计网站最重要的是要有良好的
  • 成都网站建设优化公司做网站属于什么行业
  • 卧龙区2015网站建设口碑做网站的数据库
  • 青岛做公司网站国际招聘人才网
  • 比较好的网站开发框架青岛网站开发学校
  • 内网怎么做网站昆山智能网站建设
  • 上线了 网站天津市工程建设交易管理中心网站
  • 主流门户网站有哪些兰溪建设网站
  • 繁体商城网站模板卡盟网站开发
  • 上海c网站建设电商网店开店全过程
  • 动易后台 网站统计调查 报表类型怎样使用wordpress投稿申请
  • php网站开发经理招聘免费咨询服务
  • 做爰动态视频网站哪个做问卷网站佣金高
  • 汉中市住房和城乡建设局网站wordpress 上传腾讯云
  • win2003 建设网站长沙网络推广哪家