LevelDB源码解析(2) SkipList(跳跃表)

2023-11-03

你也可以通过我的独立博客 —— www.huliujia.com 获取本篇文章

背景

SkipList是LevelDB的MemTable使用的底层存储结构,LevelDB实现了一个支持泛型的跳跃表。本文不会具体介绍跳跃表的数据结构,如果读者不了解跳跃表的原理、实现,可以先看一下跳跃表(Skiplist)从原理到实现

SkipList的对外接口

Level对外只提供了3个接口,构造、插入、查找。没有提供删除接口,这个主要是因为LevelDB不会对SkipList的元素进行删除操作,整个SkipList的存储会在MemTable被释放时一起销毁。这里可以先不管MemTable,只要知道SkipList最后会被整体删除就够了。此外因为LevelDB的SkipList是用于存储用户写入的key和value的,所以LevelDB的SkipList中不会也不允许有重复的元素。

下面是SkipList的部分代码,只展示了和对外接口相关的代码

template<typename Key, class Comparator>
class SkipList
{
public:
  explicit SkipList(Comparator cmp, Arena* arena);
  void Insert(const Key& key);
  bool Contains(const Key& key) const;
}

模板参数

template<typename Key, class Comparator>

SkipList有两个模板参数,Key和Comparator。Key是SkipList要保存的元素类型,Comparator是一个函数对象类型,用于比较两个Key的大小。

构造函数

explicit SkipList(Comparator cmp, Arena* arena);

第一个参数cmp是一个Comparator函数对象的实例,用于比较大小。第二个参数arena是一个内存分配器,SkipList会使用arena来申请内存。Arena内存分配器我们在前面的文章 —— LevelDB源码解析之Arena内存分配器介绍过。如果不了解的话,可以简单理解为malloc。SkipList将从arena申请内存,而不是直接调用malloc申请内存。

Insert 和 Contains

void Insert(const Key& key);

字如其人,插入key,不解释了。

bool Contains(const Key& key) const;

判断SkipList是否包含key,包含就返回true,反之返回false。

Iterator

LevelDB还实现了一个Iterator,用于对SkipList进行寻址、遍历等操作。下面是具体的接口和作用。

    class Iterator
    {
    public:
      // 构造函数,构造后iterator指向的是一个无效节点。
      explicit Iterator(const SkipList* list);

      // 判断当前节点(iterator指向的节点)是否是一个有效节点
      bool Valid() const;

      // 返回当前节点的值。
      const Key& key() const;

      // 指向当前节点的下一个节点
      void Next();

      // 指向当前节点的前一个节点。
      void Prev();
      
      // 指向满足 key >= target的最小节点
      void Seek(const Key& target);
        
      // 指向第一个有效节点(即不含头结点的第一个节点)
      void SeekToFirst();

      // 指向最后一个有效节点
      void SeekToLast();

    private:
      //Iterator所述的SkipList
      const SkipList* list_;
      //指向Iterator当前节点。
      Node* node_;
    };

SkipList的内部实现。

因为LevelDB的SkipList是结合LevelDB的使用场景,进行了简化的SkipList,相当于是一个丐版SkipList。本文不会介绍具体的实现逻辑,关于SkipList的完整实现逻辑,可以看跳跃表(Skiplist)从原理到实现。这篇文章的跳跃表实现参考了LevelDB的实现,但是支持插入重复元素和删除元素。

LevelDB的SkipList通过next指针数组的方式来构建整个链表结构,避免了复制节点带来的内存开销和实践开销,也让链表管理变得更为简单。

此外,LevelDB在读、写next数组时,引入了原子变量用于同步,是线程安全的,可以支持多线程场景。

内存分配器

LevelDB的SkipList的内存管理使用了LevelDB自己开发的Arena内存分配器,以提高性能。Arena内存分配器的详细介绍可以看这篇文章LevelDB源码解析之Arena内存分配器

源码版本

https://github.com/google/leveldb/releases/tag/1.22

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LevelDB源码解析(2) SkipList(跳跃表) 的相关文章

  • Integer源码解析

    这篇博客我来整理下以Integer为例整理下包装类的源码 首先来看一段代码 xff1a public class LinkinPark public static void main String args Integer a 61 1 I
  • Spring源码解析3-beanFactoryPostProcessor的执行

    refresh 中的invokeBeanFactoryPostProcessors beanFactory invokeBeanFactoryPostProcessors xff0c 实例化并且调用所有已经注册了的beanFactoryPo
  • leveldb性能调优

    许多的nosql都使用leveldb或者类似leveldb的系统作为存储引擎 xff0c 例如tair xff0c hbase xff0c canssandra xff0c 因此理解并调优存储引擎可以大大的提高系统的性能 前一篇大致介绍了原
  • 机器人地面站-[QGroundControl源码解析]-[2]

    目录 前言 一 QGC 二 QGCComboBox 三 QGCFileDownload 四 QGCLoggingCategory 五 QGCMapPalette 六 QGCPalette 七 QGCQGeoCoordinate 八 QGCT
  • BLAM源码解析(四)—— 基于ICP的位姿更新

    第三节我们介绍了定时器的定时回调 xff0c 实现对激光数据的批量循环处理 xff0c 在每一个激光数据的循环当中 xff0c 除了一开始filter 的点云过滤 xff0c 最重要的其实是下面的基于ICP的位姿更新 xff0c 即 if
  • Android-Handler源码解析-Message

    成员变量 标识Message public int what 存储简单数据 xff0c 如果存储复杂的数据使用setData 方法 public int arg1 public int arg2 发送给接收者的任意对象 public Obj
  • Android-Handler源码解析-Looper

    成员变量 Log的TAG private static final String TAG 61 34 Looper 34 线程本地变量 xff0c 保证了每个线程仅有唯一的Looper对象 64 UnsupportedAppUsage st
  • OkHttp-ConnectInterceptor源码解析

    ConnectInterceptor源码解析 本文基于okhttp3 10 0 1 概述 ConnectInterceptor主要是用于建立连接 xff0c 并再连接成功后将流封装成对象传递给下一个拦截器CallServerIntercep
  • FreeRTOS源码解析 -> vTaskDelete()

    vTaskDelete API 函数 任务可以使用API函数vTaskDelete 删除自己或其它任务 任务被删除后就不复存在 xff0c 也不会再进入运行态 空闲任务的责任是要将分配给已删除任务的内存释放掉 因此有一点很重要 xff0c
  • ConcurrentHashMap -1.8 源码解析

    ConcurrentHashMap 1 8 源码解析 加锁机制 在JDK1 7之前 xff0c ConcurrentHashMap是通过分段锁机制来实现的 xff0c 所以其最大并发度受Segment的个数限制 因此 xff0c 在JDK1
  • freeRtos源码解析(二)–任务调度

    freeRtos源码解析 二 任务调度 一 启动任务调度器 启动任务调度器之后 xff0c CPU正式进入任务模式调度各任务 xff08 CPU在中断模式和任务模式之间不断轮转 xff09 freeRtos任务调度依赖于内核的三个中断 xf
  • leveldb源码分析--SSTable之Compaction 详解

    http www cnblogs com KevinT p 3819134 html leveldb源码分析 SSTable之Compaction 对于compaction是leveldb中体量最大的一部分 也应该是最为复杂的部分 为了便于
  • leveldb代码结构

    leveld代码结构 源文件 tree I test AUTHORS build detect platform db 具体逻辑 builder cc 定义了BuildTable函数 builder h c cc c封装 暂时不用看 db
  • leveldb官方手册摘录

    本文内容摘自leveldb官方手册 版权归其所有 CHAPTER 1 基本概念 leveldb是一个写性能十分优秀的存储引擎 是典型的LSM树 Log Structured Merge Tree 实现 LSM树的核心思想就是放弃部分读的性能
  • LevelDB源码解析(2) SkipList(跳跃表)

    你也可以通过我的独立博客 www huliujia com 获取本篇文章 背景 SkipList是LevelDB的MemTable使用的底层存储结构 LevelDB实现了一个支持泛型的跳跃表 本文不会具体介绍跳跃表的数据结构 如果读者不了解
  • LevelDb之七:根据Key读取记录

    LevelDb之七 根据Key读取记录 2012 09 08 17 54 41 分类 云计算 LevelDb是针对大规模Key Value数据的单机存储库 从应用的角度来看 LevelDb就是一个存储工具 而作为称职的存储工具 常见的调用接
  • Log Structured Merge Trees(LSM) 原理(LSM 算法的原理是什么?)

    十年前 谷歌发表了 BigTable 的论文 论文中很多很酷的方面之一就是它所使用的文件组织方式 这个方法更一般的名字叫 Log Structured Merge Tree LSM是当前被用在许多产品的文件结构策略 HBase Cassan
  • xxl-job(2.4.1)使用spring-mvc替换netty的功能

    xxl job 2 4 1 使用spring mvc替换netty的功能 1 xxl job core引入spring mvc的依赖
  • okyo Cabinet简介

    http idning github io ssd cache html http blog 163 com zbr 4690 blog static 126613593200910312346337 http blog chinaunix
  • LMDB 是否支持多个键到相同值的映射?

    是否可以将多个键映射到同一个值 如果没有 是否有解决此功能的方法 这是不可能的 我使用的一种解决方法是让第二个键上的值成为指向主键的指针 也就是第二个键的值is主键 特别是 我制作了一个辅助键表 或 lmdb 中的 命名数据库 其中所有va

随机推荐

  • 四 通用目标之make modules的执行过程分析

    搜索顶层makefile发现会有两个modules目标 它们的定义分别如图3 13和3 14 查看代码发现它们分别位于ifeq KBUILD EXTMOD 和else的条件中 KBUILD EXTMOD的定义可以参考图2 5 即若编译的为外
  • 小学六年级计算机知识点总结,【小学六年级数学总复习知识点归纳】

    一 复习内容 1 分数乘除法 分数乘 除法属于分数的基本知识和技能 而且两者关系密切 教材将这两部分内容集中安排 教材首先通过一组题目 强调分数乘除法的关系 即分数除法是分数乘法的逆运算 同时对分数乘除法的计算方法进行了复习 比的相关概念
  • C++第七次实验——作业

    项目1 include
  • Qt多线程http下载器之二:仿迅雷新建下载任务

    一 效果 下图是迅雷9的新建任务界面 目前最新的版本是迅雷11 迅雷9已无法准确检测出文件大小 但任然能正常下载 个人觉得迅雷9的新建任务界面更美观 故仿之 下图是我用Qt实现的效果 功能和迅雷9类似 复制下载url到输入框 迅雷能够自动解
  • JavaWeb基础6——Request,Response,JSP&MVC

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 一 Request Response概述 二 R
  • MsSqlServer配置管理器TCP/IP属性

    TCP IP 属性 IP 地址 选项卡 使用 TCP IP 属性 IP 地址 选项卡 对话框 可以配置特定 IP 地址的 TCP IP 协议选项 只有选中 IP All 才能一次配置所有地址的 TCP 动态端口 和 TCP 端口 更改在重启
  • OpenCV使用imread读取图片失败解决方案

    使用一下代码读取图像 出现 WARN 0 1 635 global D a opencv python opencv python opencv modules imgcodecs src loadsave cpp 239 cv findD
  • pymongo.errors.ConfigurationError: All nameservers failed to answer the query _mongodb

    pycharm一直报错 安装了最新版的python也没用 我现在用的是python3 6版本进行代码运行 代码如下 运行就报错 反反复复找了很久终于解决 需要在导入pymongo之前导入此代码 import dns resolver dns
  • 51个常用免费工具列表

    2023 年可用于查找 分析和研究加密货币的 51 个免费网站和指标 一 发现新代币和项目 https coinmarketcap com ico calendar 查市值 即将推出的 ICO 和 IDO 的信息 https coinbra
  • linux整理-GUN讲解, GPL LGPL BSD等各种开源协议许可证的区分

    什么是GUN GNU 1983年 Richard Stallman 理查德 马修 斯托曼 创立GNU计划 一套完全自由的操作系统 其内容软件完全以GPL方式发布 这个操作系统是GNU计划的主要目标 发展出一套完整的开放源代码操作系统来取代U
  • Linux 内核ethtool框架新增刷网卡firmware功能

    原文地址 http blog csdn net macrocrazier article details 6340452 现在的网卡 尤其是智能网卡 高速网卡 硬件性能越来越强大 承载的功能也越来越多 开发者对网卡内部功能的增加或修改 对已
  • openwrt开发使用-增加启动脚本

    前言 在使用openwrt时候我们会遇到增加自定义的开机启动任务活脚本 今天给大家分享一下openwrt中设置一个开机启动脚本的操作 作者 良知犹存 转载授权以及围观 欢迎关注微信公众号 羽林君 或者添加作者个人微信 become me o
  • AI 智能对话 - 基于 ChatGLM2-6B 训练对话知识库

    前情提要 怎么将 AI 应用到工作中呢 比如让 AI 帮忙写代码 自己通过工程上的思维将代码整合排版 我挺烦什么代码逻辑严谨性的问题 但是我又不得不承认这样的好处 我们要开始将角色转换出来 不应该是一个工具人 而成为决策者 这是从 AI 爆
  • flutter使用:barcode_scan出现注册清单问题

    问题 使用出现activity是否有注册到清单文件问题 如 android content ActivityNotFoundException Unable to find explicit activity class com met m
  • Unity中触摸和鼠标操作的几个问题

    关键点1 在unity中touch事件同时也会触发GetMouseButton事件 有时候可能会给你带来方便 但是如果没有意识到这个问题的话 也很可能给你带来很大的麻烦 关键点2 触摸操作也可以使用Input GetAxis Mouse X
  • IGH_Master主站配置驱动伺服电机和变频器总结

    IGH Master主站配置驱动伺服电机和变频器总结 Ethercat是倍福公司提出的一种工业现场总线协议 具有很好的实时性 IGH是一种开源的Ethercat主站实现协议 本文总结了一下使用IGH Master驱动伺服电机和变频器的经验
  • 备战数学建模44-聚类模型(攻坚站8)

    物以类聚 人以群分 所谓的聚类 就是将样本划分为由类似的对象组成的多个类的过程 聚类后 我们可以更加准确的在每个类中单独使用统计模型进行估计 分析或预测 也可以探究不同类之间的相关性和主要差异 聚类和上一讲分类的区别 分类是已知类别的 聚类
  • Flutter-(八)实现-View-的移动拖拽

    先来看效果 第一步 在main方法中用MaterialApp和Scaffold作为应用主框架 这里我就不详细展开说明了 这样做主要是为了显示效果更好 你可以使用你熟悉的Widget控件完成 void main runApp Material
  • 【H5】标签class类名属性的动态修改方法:

    H5 标签class类名属性的动态修改方法 box classList add className 添加类名 box classList remove className 删除属性 box classList toggle classNam
  • LevelDB源码解析(2) SkipList(跳跃表)

    你也可以通过我的独立博客 www huliujia com 获取本篇文章 背景 SkipList是LevelDB的MemTable使用的底层存储结构 LevelDB实现了一个支持泛型的跳跃表 本文不会具体介绍跳跃表的数据结构 如果读者不了解