LevelDB 源码阅读:跳表的原理、实现以及可视化

在 LevelDB 中,内存 MemTable 中的数据存储在 SkipList(跳表) 中,用来支持快速插入。跳表是 William Pugh 在论文 Skip Lists: A Probabilistic Alternative to Balanced Trees 中提出的一种概率性数据结构。有点类似有序链表,但是可以有多层,通过空间换时间,允许快速的查询、插入和删除操作,平均时间复杂度为 $ O(\log n) $。和一些平衡树比起来,代码实现也比较简单,性能稳定,因此应用比较广泛。

跳表实现的启发思路

那么跳表的原理是什么?LevelDB 中跳表又是怎么实现的呢?LevelDB 的跳表实现有哪些亮点以及优化呢?如何支持单线程写,并发读跳表呢?本文将从跳表的原理、实现等方面来深入探讨。最后还提供了一个可视化页面,可以直观看到跳表的构建以及整体结构

阅读全文

Claude3.5 系统提示词解密:不道歉、脸盲、幻觉...

最近 anthropic 公布了 Claude3.5 模型的系统提示词,非常值得借鉴。整个提示词用英文写的,比较长,约束了模型的许多行为,下面一起来看看。

Claude3.5 系统提示词

阅读全文

LevelDB 源码阅读:内存分配器、随机数生成、CRC32、整数编解码

LevelDB 中实现了不少 utils 工具,比如定制的内存分配器 Arena,随机数生成类 Random,实现中都会考虑到具体的使用场景,做了优化以及取舍,值得好好学习。本篇文章主要聊聊下面部分的实现:

  • 内存管理 Arena,一个简单高效,适合 LevelDB 的内存分配管理器;
  • 随机数 Random,一个不错的线性同余伪随机生成算法,用位运算替代取模优化了执行效率。
  • CRC32 循环冗余校验,用于检测数据传输或存储过程中是否发生错误;
  • 整数编、解码,用于将数字存储在字节流或者从字节流中解析数字。

此外,还有些 utils 组件比较复杂些,会放在单独的文章里聊,比如:

阅读全文