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

【新书速递】你不知道的LevelDB

7ad1876811da851174935f007b42abab.png

你不知道的LevelDB

你也许没听说过LevelDB

但是你一定应该听过Bigtable

简单说,LevelDB=Bigtable单机版

谷歌大神Jeff Dean与Sanjay Ghemawat开发并开源

LevelDB实现了Bigtable的基本原理与技术细节

具有C++开发、高性能、键-值型、持久性存储特性

把LevelDB作为底层库,可满足你多种业务需求

LevelDB系出名门,易学易用,是研究数据库不二之选

f10236dc84522ea991c25e9510326435.png

LevelDB的优点体现在:

  • key与value采用字符串形式,且长度没有限制;

  • 数据能持久化存储,同时也能将数据缓存到内存,实现快速读取;

  • 基于key按序存放数据,并且key的排序比较函数可以根据用户需求进行定制;

  • 支持简易的操作接口API,如Put、Get、Delete,并支持批量写入;

  • 可以针对数据创建数据内存快照;

  • 支持前向、后向的迭代器;

  • 采用Google的Snappy压缩算法对数据进行压缩,以减少存储空间;

  • 基本不依赖其他第三方模块,可非常容易地移植到Windows、Linux、UNIX、Android、iOS。

LevelDB的缺点体现在:

  • 不是传统的关系数据库,不支持SQL查询与索引;

  • 只支持单进程,不支持多进程;

  • 不支持多种数据类型;

  • 不支持客户端-服务器的访问模式。用户在应用时,需要自己进行网络服务的封装。

国内各大互联网厂商有各类基于LevelDB(或者RocksDB)的分布式键-值存储,《精通LevelDB》是唯一系统分析LevelDB实现原理的中文书籍。

363ed2934ee6d7417a9c70c70b6b7e91.png

实战+架构,带你入门

实战

基本特性

基本数据结构

基本使用

架构

主要模块

主要功能

5大公用基础类+4大模块,走向精通

5公用基础类

跨平台编程

文件操作

操作环境抽象接口

Int数值管理

内存管理

4大模块

Log模块

SSTable模块

MemTable模块实现机制与源码

Compaction原理与多版本管理

阿里巴巴和贝壳找房专家撰写

474f8ccb624b09634bc68d8eb6c41218.png

廖环宇

中南大学硕士、阿里云高级算法专家与工业大脑算法团队负责人,长期致力于人工智能算法与工业大数据技术的研究和实践,主导过许多大型数据智能平台的开发与应用。

ad22415ecd2148c080d23694f9facb25.png

张仕华

贝壳找房资深软件开发工程师,毕业于北京科技大学,曾就职于360、滴滴。热衷源码研究与探究技术本质,合著有《Redis 5设计与源码分析》。

内容简介

本书详细剖析LevelDB从使用到设计实现的方方面面,读后可了解谷歌Bigtable数据库的设计精髓,逻辑上可分为两部分。

第一部分着重讲解LevelDB的基础知识,主要内容如下。
1)基本数据结构,这是理解后续内容的基础,也可以加深对比较器、迭代器等常见数据结构的理解。
2)基本使用,如数据库打开、关闭以及基本的读写操作。
3)总体架构与设计思想,读后可掌握LevelDB的整体情况与设计思路。
4)公用基础类,读后可了解LevelDB中如何实现数值编码、内存管理以及文件读取等。



第二部分着重讲解LevelDB各模块的实现细节,主要内容如下。
1)Log模块的实现细节,以及如何通过Log进行崩溃恢复,并生成一个MemTable文件。
2)MemTable模块的实现细节,以及MemTable超过内存阈值时如何生成一个SSTable文件。
3)SSTable模块的实现细节。
4)Compaction原理与多版本管理。

目录

前言

第1章 初识LevelDB1

1.1 键-值数据库的提出与价值1

1.2 LevelDB的诞生过程2

1.3 LevelDB的特性3

1.4 LevelDB的性能分析4

1.5 LevelDB的衍生产品5

1.5.1 RocksDB6

1.5.2 SSDB7

1.6 小结8

第2章 基本数据结构9

2.1 string与Slice9

2.2 错误处理Status10

2.3 key比较函数接口Comparator11

2.4 迭代器接口13

2.5 系统参数14

2.5.1 DB参数Options14

2.5.2 读操作参数ReadOptions16

2.5.3 写操作参数WriteOptions16

2.6 小结17

第3章 LevelDB使用入门18

3.1 源码简介18

3.1.1 目录结构18

3.1.2 安装与编译19

3.1.3 引用头文件20

3.2 创建(打开)与关闭数据库21

3.3 数据的读、写与删除23

3.4 数据批量操作24

3.5 迭代器与key的查询操作26

3.5.1 前向与反向迭代循环遍历26

3.5.2 按key的范围进行查询27

3.6 性能优化方案28

3.6.1 启用压缩28

3.6.2 启用Cache29

3.6.3 启用FilterPolicy30

3.6.4 key的命名设计30

3.7 小结31

第4章 总体架构与设计思想32

4.1 键-值存储系统的基本要求32

4.2 Bigtable与LevelDB 33

4.3 主要模块功能介绍34

4.4 主要操作流程分析36

4.4.1 数据库Open流程分析36

4.4.2 数据Get流程分析39

4.4.3 数据Put与Write流程分析42

4.4.4 快照生成与读取分析46

4.5 小结48

第5章 公用基础类49

5.1 LevelDB跨平台编程49

5.1.1 LevelDB操作系统可移植方案49

5.1.2 LevelDB移植到操作系统接口规范50

5.1.3 POSIX可移植操作系统接口55

5.1.4 原子指针与内存屏障61

5.2 文件操作66

5.2.1 顺序文件操作66

5.2.2 随机文件操作73

5.2.3 Log文件操作77

5.3 Env操作环境抽象接口81

5.3.1 PosixEnv对象84

5.3.2 EnvWrapper与InMemoryEnv93

5.4 int数值编码99

5.4.1 什么是编码99

5.4.2 int定长数值编码100

5.4.3 int变长数值编码102

5.5 内存管理104

5.5.1 Arena内存池的基本思想105

5.5.2 Arena内存池的定义与原理105

5.5.3 Arena内存的分配108

5.5.4 内存使用率统计114

5.5.5 非内存池的内存分配优化115

5.6 小结116

第6章 Log模块117

6.1 Log文件格式定义117

6.2 Log文件读写操作119

6.2.1 Log文件写入119

6.2.2 Log文件读取122

6.3 记录Log文件124

6.4 从Log文件恢复MemTable125

6.5 小结126

第7章 MemTable模块127

7.1 MemTable插入与查找127

7.1.1 MemTable插入128

7.1.2 MemTable查找129

7.2 SkipList插入与查找131

7.2.1 SkipList插入132

7.2.2 SkipList查找134

7.3 MemTable生成SSTable136

7.4 小结137

第8章 SSTable模块139

8.1 SSTable文件格式139

8.1.1 SSTable的组成140

8.1.2 块格式141

8.1.3 数据索引区域145

8.1.4 数据区域145

8.1.5 元数据索引区域145

8.1.6 元数据区域146

8.2 SSTable的读写流程148

8.2.1 生成块148

8.2.2 读取块151

8.2.3 生成SSTable152

8.2.4 读取SSTable156

8.3 布隆过滤器的实现158

8.3.1 布隆过滤器的设计160

8.3.2 布隆过滤器的使用162

8.4 LRU Cache的实现166

8.4.1 LRU Cache的设计167

8.4.2 LRU Cache的使用173

8.5 小结174

第9章 多版本管理与Compaction原理176

9.1 多版本管理机制177

9.1.1 VersionEdit机制177

9.1.2 Version机制182

9.1.3 VersionSet机制187

9.1.4 Manifest机制189

9.2 Compaction原理189

9.2.1 触发时机190

9.2.2 文件选取191

9.2.3 执行流程195

9.2.4 文件清理197

9.3 小结199

附录 LevelDB的演进200

上下滑动查看

实拍

92179b477aa16d727e27373010342a71.png

5a855d779e376584aa8a1165b888ff09.png

6553308301f400c91efeb43a10231112.png

03e38d27779e18ec7fdbcadbf6470990.png

63e4195f2ae3bff38aa668bac7fc8274.png

扫码抢购

55d3e2db5b962bea432bcd7f9a4f44a4.gif

20cd906efc8cbcff62418d3ad3448f5d.png

扫码关注【华章计算机】视频号

每天来听华章哥讲书

a06bccdeef5b9cf94467c9b28fb081a8.png

更多精彩回顾

书讯 | 11月书讯(上)| 拿下这些新书,赢在起跑线

书讯 | 11月书讯(下) | 拿下这些新书,赢在起跑线

资讯 | 为什么 Rust 是编程的未来?

书单 | 8本书助你零基础转行数据分析岗

干货 | SpringBoot 实战:加载和读取资源文件内容

收藏 | 看漫画来告诉你:什么是 “元宇宙” ?

上新 | 【新书速递】产品经理应该知道的72件事

9b75c9596070465351d57ef19817c58e.gif

445df4fb489ec7ffe35e22ebd005adec.png

点击阅读全文购买

相关文章:

  • 手把手教你写一个迷你 Webpack
  • 聊聊“企业架构”这个连很多IT老兵都陌生的词
  • 【新书速递】解决方案架构师修炼之道
  • CPU可以跑多快?地球到火星的距离告诉你!
  • 解析OpenShift的存储规划
  • 12月书讯(上) | 冬夜寒冷,读书暖心,华章科技上新啦!
  • IEEE发布2022年科技趋势全球调研:人工智能和机器学习、云计算及5G将成为下一年最重要的技术...
  • 12月书讯(下) | 冬夜寒冷,读书暖心,华章科技上新啦!
  • 【新书速递】Django3.0应用开发详解
  • 几句话,送给程序员
  • 深度学习+知识图谱,一个不小心就顶流的话题
  • 【新书速递】终于有人把Spring Data JPA 讲明白了
  • 5G+AIoT时代,为什么IoT产品经理大有可为?
  • 边缘计算,为什么一定会迎来大爆发?
  • 做技术开发到老 or 晋升管理层,程序员的终极目标是什么?
  • 10个确保微服务与容器安全的最佳实践
  • download使用浅析
  • extjs4学习之配置
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Git同步原始仓库到Fork仓库中
  • Python打包系统简单入门
  • React-flux杂记
  • scala基础语法(二)
  • springboot_database项目介绍
  • SQLServer之索引简介
  • v-if和v-for连用出现的问题
  • 从零开始在ubuntu上搭建node开发环境
  • 关于使用markdown的方法(引自CSDN教程)
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 什么软件可以剪辑音乐?
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 线性表及其算法(java实现)
  • 一个JAVA程序员成长之路分享
  • 一个完整Java Web项目背后的密码
  • 自定义函数
  • 函数计算新功能-----支持C#函数
  • 移动端高清、多屏适配方案
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • (13):Silverlight 2 数据与通信之WebRequest
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (转)iOS字体
  • (转)用.Net的File控件上传文件的解决方案
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Core WebAPI中封装Swagger配置
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • /etc/fstab和/etc/mtab的区别
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解