TC hdb代码分析

    在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删除 操作

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值