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