在TC中一个最小的unit的大小是48字节 其中record的头信息是40字节 但是在TC中默认是16字节对齐的 所以就是48字节 在tchdbreadrec读取的时候也是读取最小的大小 也就是48个字节 刚好可以把头信息读取进来
在TC中可以通过设置hdb->zmode和hdb->opts参数来启用压缩功能 压缩只是针对value的
tchdbnew
创建一个新的TC hdb数据库对象 并且设置一些初始话的参数(其中设置参数是在tchdbclear中进行的)
hdb->type = TCDBTHASH;
hdb->bnum = HDBDEFBNUM; 设置bucket number为默认的大小131071
hdb->apow = HDBDEFAPOW; 默认align power大小是4 也就是16位对齐
hdb->fpow = HDBDEFFPOW; 默认free block pool power 是10也就是2^10就是1024个
hdb->xmsiz = HDBDEFXMSIZ; 默认大小是64m
hdb->recc = NULL;
hdb->rcnum = 0; 默认record cache是关闭的
tchdbopen
在打开的时候 会对hdb数据库对象的一些参数 做进一步的初始化
它首先会判断数据库文件的大小 如果文件小于1那么说明是新创建的一个数据库 这个时候会格式化数据库文件 比如写些tc版本等信息到数据库文件 写入hdb的头信息 free block pool和bucket array置零等等
然后读取数据库的信息并且设置hdb数据库结构 map hdb->xmsiz到hdb->map 由于hdb->xmsiz默认大小是64M这样可以保证map到内存的文件内容是包括所有的头信息的 这样sync的时候只要把头部信息写道hdb->map中然后sync hdb->map就可以拉
tchdbsync
调用这个函数的时候 会把tc内存的信息同步到数据库文件中去 它首先判断是否有异步写的内容没有持久化到数据库文件中去 如果有那么就flush到文件中去 然后sync hdb数据库的头部信息到文件中去 这个sync的过程是调用tchdbmemsync 其中phys参数是true也就是 会做一次物理同步 它先是把hdb的metadata dump到一块内存中去tchdbdumpmeta(hdb, hbuf); 然后把这块内存copy到hdb->map中去 如果phys设置成true那么 就会msync(hdb->map, xmsiz, MS_SYNC)其中xmsiz是hdb->map的大小 在默认设置中是64M 然后在调用fsync(hdb->fd)做一次同步操作
tchdbput
调用这个函数的时候 首先是把内存中的record flush到文件中去 然后寻找key对应的值是否存在 这个寻找是在文件里面搜索的 但是在文件里面针对每个record是做了hash 然后对于冲突是用btree来解决的 虽然文件寻找速度很慢 但是通过这样的优化还是可以接受的 如果存在 那么就把原来的值给覆盖 否这直接写到文件中去
tcputasync
现判断写缓存是否存在 如果不存在创建一个HDBDRPUNIT + HDBDRPLAT大小的写缓存 并且创建一个HDBDRPUNIT大小的hdb->drpdef存放deferred record
先是去文件中搜索key对应的条目是否存在 如果存在把数据写到hdb->drpdef中 在文件中分配空间给数据并且标记这个条目的存在 把数据添加到hdb->fbpool中去
tchdbget
读取数据之前 会把些缓存的中的数据(hdb->drpool和hdb->drpdef)刷新到文件中去 然后再读
先会判断record cache 也就是hdb->recc是否为空 如果不是空 就去缓存里面读数据 如果读到数据并且开头是*说明数据不存在 返回空 否这返回读到的数据 如果数据不存在就回去文件里面查找数据
在文件里面查找数据就是作hash和btree搜索 如果找到数据后那么就读取数据,需要解压缩 就解压缩 如果缓存开启 那么就先把数据写到读缓存然后返回数据 如果没有找到数据 那么就更新读缓存(如果开启)用*代表数据 表示数据不存在 并且返回空
tchdbdel
释放hdb占有的资源
tchdbout
删除操作 删除key对应的一个条目 和读一样 做删除前判断是否有写缓存 如果有那么就先把写缓存刷新到数据库文件中去
先还是去数据库文件中搜索key对应的条目 如果没有找到 设置error code 并且返回false
如果找到 执行删除操作 显示释放key对应的条目 并且把它对应的block加入到free block pool 如果free block pool条目过多 就整理下free block pool
后面就是简单的btree删除 操作
本文详细介绍了TC数据库的内部工作原理,包括记录的最小单位、压缩功能、数据库对象的创建与初始化过程、同步机制以及数据读写的具体实现方式。
7万+

被折叠的 条评论
为什么被折叠?



