分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
【原创】Key-Value小数据库tmdb发布:原理和实现
Key-Value 数据库是很早起比较典型的老式数据库,从Unix早期的dbm,后来的GNU版本的gdbm,还有ndbm,sdbm, cdb 以及功能强大的Berkeley DB (BDB)、还有这两年风头很劲的qdbm,都是典型代表。实际上来说,Key-Value 数据库不是严格意义上的数据库,只是一个简单快速的数据存储功能。
tmdb 也是差不多这么一个性质Key-Value小数据存储(DBM),设定存储数据目标量级是10W级,性能嘛也不是很好,算是一个小实验型产品。(tmdb 下载)
说说它的基本特点:
- 存储数据量级为10W,超过后性能下降的厉害
- 因为存储特点决定,更适合存储只读数据,当然,它也是可以删除和修改数据的,只是比较浪费空间
- Key长度不能超过64个字节,数据长度不能超过65536个字节,适合存储一些小数据
- 使用的不是行级锁(Row-Level-Lock),而且是全局锁,所以并发读写情况下,性能不是很好
- 索引文件和数据文件分离,备份情况下要全部备份
- 接口API基本是按照传统的dbm的API来设定,整个库文件较小,可直接静态编译进程序
简单说说大致的设计思路,设计方案基本是简单容易实现的方式来操作(主要是自己懒),大致说说实现,实现的比较糟糕,请不吝指教。
【 存储结构 】
索引使用的是静态索引,Hash表的长度不能动态扩容,缺省是 65535 Hash Bucket,如果冲突的情况使用开拉链法,那么如果冲突厉害,或者数据量大,自然大大增加了查找一条记录的时间,所以小数据量并且Key分布均匀下性能比较好(所有hash都是这样好不好 ^_^)。
上面特点说了,索引和数据文件是分离的,主要是为了动态扩容的时候不用做太多数据迁移和位置计算。
数据存储是单个文件,头部预留了256个字节的剩余,后面的都是用来存数据,所有数据都是 append 的方式,一个数据被删除,只在索引修改标志位,不会做实际数据迁移,也不会做空闲数据空间链表记录(偷懒啊),所以结构比较简单。
看一下索引文件的存储结构:
Index File Struct:
+-----------+----------------------+--------------+----------------+
| Header | Key ptr buckets | Key Record 1 |Key Record 2 .. |
+-----------+----------------------+--------------+----------------+
256Bytes 262144Bytes(256KB) 76Bytes 76Bytes
预留了 256字节的头部空间,用来后续扩展,然后是 256K 的用来存储hash桶到一条Key的指针位置(Key Record),设定的是 65536 * 4 = 256K,所以整个索引文件不能超过2G数据文件,否则单个4字节的指针空间存储不下 (^_^)。
Key Record 是存储一个Key信息的记录,一个Key信息的结构:
Index key record
+-------+--------------+----------+----------+
| Flag | Key | Data ptr | Next ptr |
+-------+--------------+----------+----------+
4Bytes 64Bytes 4Bytes 4Bytes
Flag 4个字节是标志是否删除,或者别的。Key 是定长的 64 字节,Data Ptr 是数据指