mysql做kv数据库_从零开始写KV数据库:基于哈希索引

前言

新的KV数据库层出不穷,我们经常听说的KV数据库如RocksDb、Hbase等都是基于日志结构的存储引擎。最近我在看《数据密集型应用系统设计》,里面有一章专门在讲日志结构的存储引擎的演进过程,纯看理论不过瘾,所以我决定根据书里的理论动手自己实现一个KV数据库。同时,为了能顺便学习Rust,所以我使用了Rust来实现数据库。

除了参考《数据密集型应用系统设计》,我还参考了《pingcap/talent-plan》中使用Rust实现KV数据库的源码,恰好它的实现就是基于哈希索引和日志压缩的原理,跟书中的描述不谋而合。通过实现一个迷你数据库来学习和理解数据库的原理是一种学以致用的方式,能够帮助我们更加深入理解数据库原理。闲话不多说,开始正文。

最简单的数据库

在上正菜之前先来一道甜点,你知道最简单的数据库只需要几行代码吗?只需要两行,一行读取,一行写入。

#!/bin/bashdb_set() {echo"$1,$2" >> database}db_get() { grep "^$1," database | sed -e "s/^$1,//" | tail -n 1}可以尝试保存脚本,然后在shell中试一下。

~ source db.sh ~ db_set key1 value1 ~ db_set key2 value2 ~ db_set key1 value1 ~ db_set key1 value2 ~ db_get key1value2 ~ cat databasekey1,value1key2,value2key1,value1key1,value2是不是很神奇,其实原理很简单,set的操作是将数据追加到文件末尾,get的操作是先grep找到所有key的数据,然后再取最后一条数据(tail -n 1)作为结果。仔细思考一下,这个数据库逻辑是正确的,而且还是持久化的。

这个数据库原理虽然简单,但是其中set使用日志追加的方式写入数据却是很多数据库的常用方式,因为日志追加性能非常好。相对的,get的方式性能就比较差了,需要从头到尾扫描整个文件,查询的开销是O(n)。

为了提高读取的性能,我们需要用到索引,基本的思路就是通过保存额外的元数据,根据这些元数据作为路标来快速定位到想要的数据。但是天下没有免费的午餐,维护索引需要在写入的时候额外写入其他数据,这会影响写入的性能。这里就涉及到存储系统中重要的权衡设计:适当的索引可以加速读取,但是每个索引都会减慢写入的速度。下面我们就给我们简单的数据库加上最简单的索引方式:哈希索引。

基于哈希索引的数据库

回想一下我们经常使用HashMap数据结构,哈希索引就是基于内存的HashMap来实现的,不同的是我们在内存里面使用HashMap的时候value都是直接存储原始数据的,对于数据库来说,如果你把所有的原始数据都直接存储到内存的话,这是不现实的。那怎么办呢?想想我们在编程里面常用的指针,是不是得到启发了?我们可以在内存里面保存原始数据的“指针”,即文件的字节偏移量和数据的长度。指针的占用量很小,这样我们完全可以把整个数据库的key的索引都放到内存里面,读取的时候直接找到key在文

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值