一个简单的Key-Value小数据库tmdb的原理和实现
1 基本特点
ey-Value 数据库是很早起比较典型的老式数据库,从Unix早期的dbm,后来的GNU版本的gdbm,还有ndbm,sdbm, cdb 以及功能强大的Berkeley DB (BDB)、还有这两年风头很劲的qdbm,都是典型代表。实际上来说,Key-Value 数据库不是严格意义上的数据库,只是一个简单快速的数据存储功能。
tmdb 也是差不多这么一个性质Key-Value小数据存储(DBM),设定存储数据目标量级是10W级,性能嘛也不是很好,算是一个小实验型产品。
说说它的基本特点:
- 存储数据量级为10W,超过后性能下降的厉害
- 因为存储特点决定,更适合存储只读数据,当然,它也是可以删除和修改数据的,只是比较浪费空间
- Key长度不能超过64个字节,数据长度不能超过65536个字节,适合存储一些小数据
- 使用的不是行级锁(Row-Level-Lock),而且是全局锁,所以并发读写情况下,性能不是很好
- 索引文件和数据文件分离,备份情况下要全部备份
- 接口API基本是按照传统的dbm的API来设定,整个库文件较小,可直接静态编译进程序
2 存储结构设计
索引使用的是静态索引,Hash表的长度不能动态扩容,缺省是 65535 Hash Bucket,如果冲突的情况使用开拉链法,那么如果冲突厉害,或者数据量大,自然大大增加了查找一条记录的时间,所以小数据量并且Key分布均匀下性能比较好(所有hash都是这样好不好 ^_^)。
上面特点说了,索引和数据文件是分离的,主要是为了动态扩容的时候不用做太多数据迁移和位置计算。
数据存储是单个文件,头部预留了256个字