一个退役中校教你如何用go语言写一个基于B+树的json数据库(进阶篇)之BsTr tree(一)

文章详细描述了BsTrtree的数据结构,包括深度、页面大小、flag的用途,以及在多线程环境下的安全Put操作机制,特别强调了驻留协程、缓冲通道和表级并行执行。
摘要由CSDN通过智能技术生成

1. BsTr tree结构图

图片

  • 图中的深度是指表所代表的树的深度。页面大小为文件中chunk的大小。flag为表key的类型和数据的形式。入口chunk为树的根地址。offset为在文件中的存储位置。时间戳为创建表的时间戳,按纳秒计算。dorped表示表是否被标记为删除。

  • 图中各表的深度默认都为3层,最高层是次层各个chunk的最大关键字的有序组合,依次类推,直至叶子节点。叶子节点包含数据,而树枝节点只包含关键字。上图的parent、left、right是三个指针,分别指向父节点、左右兄弟节点,图中没有画指向箭头,只是标记了相应节点的最大key来指代指针的指向。

  • 可以看的出来,BsTr tree和一般的B+树不同的是,除了指向孩子节点的指针和offset,它还包含了指向父节点和左右节点的指针和offset(offset用于实现指针混写,在内存和文件页面间自由转换)。

  • flag支持多种组合。具体如下:

  •     THE BSTRTREE CAN WANDER BETWEEN MEMORY AND DISK

  •     SUPPORT KEY OF 5 TYPES:STRING/[]BYTE/COMPLEX128/INT64/FLOAT64

  •     DIFFERENCE BETWEEN MEM MODE AND NON-MEM MODE: NON-MEM MODE WRITE ALL OPERATION TO DISK, MEM MODE NOT.

  •     DO NOT RECOMMEND COMPRESS | BIG

  •     BECAUSE DATA WAS COMPRESSED, WILL MAY NOT SATISFY BIG MODE.

  •     UNIQUE: UNIQUE KEY

  •     STRKEY: STRING TYPE KEY

  •     NOSERIAL: NOT SERIALIZE DATA.  SERIAL MODE: SERIALIZE DATA TO A BSTR STRUCT FIRSTLY.

  •     BIG: BIG DATA MODE

  •     FILEBIG: BIG DATA SAVE TO FILE, INCLUDE BIGDATA NOT USE BIG MODE. BE CAREFULLY, WHEN READ, MAYBE OOM.

  •     NUMBERED: SORTED DATA NO.

  •     COMPRESS: COMPRESS DATA

  •     NULLKEY: KEY IS NULL, NOT AVAILABLE CURRENTLY.

  •     I64KEY: INT64 KEY

  •     F64KEY: FLOAT64 KEY

  •     C128KEY: COMPLEX128 KEY

  •     BSKEY: []BYTE KEY

  •     NULL: KEY CAN NULL,NOT NULLKEY

  •     EMBEDED: EMBEDED MODE, A DB AS A KEY-DATA

  •     MEM: memory mode, collide with FILEBIG

  • -----------------------------------------------------------

  • Example as StrKey composite:

  •     UNIQUE|STRKEY|NOSERIAL

  •     UNIQUE|STRKEY|NOSERIAL|BIG

  •     UNIQUE|STRKEY

  •     UNIQUE|STRKEY|BIG

  •     UNIQUE|STRKEY|NOSERIAL|FILEBIG

  •     UNIQUE|STRKEY|NOSERIAL|BIG|FILEBIG

  •     UNIQUE|STRKEY|FILEBIG

  •     UNIQUE|STRKEY|BIG|FILEBIG

  •     STRKEY|NOSERIAL

  •     STRKEY|NOSERIAL|BIG

  •     STRKEY

  •     STRKEY|BIG

  •     STRKEY|NOSERIAL|FILEBIG

  •     STRKEY|NOSERIAL|BIG|FILEBIG

  •     STRKEY|FILEBIG

  •     STRKEY|BIG|FILEBIG

  •     NUMBERED|UNIQUE|STRKEY|NOSERIAL|BIG

  •     NUMBERED|UNIQUE|STRKEY

  •     NUMBERED|UNIQUE|STRKEY|BIG

  •     NUMBERED|UNIQUE|STRKEY|NOSERIAL|FILEBIG

  •     NUMBERED|UNIQUE|STRKEY|NOSERIAL|BIG|FILEBIG

  •     NUMBERED|UNIQUE|STRKEY|FILEBIG

  •     NUMBERED|UNIQUE|STRKEY|BIG|FILEBIG

  •     NUMBERED|STRKEY|NOSERIAL

  •     NUMBERED|STRKEY|NOSERIAL|BIG

  •     NUMBERED|STRKEY

  •     NUMBERED|STRKEY|BIG

  •     NUMBERED|STRKEY|NOSERIAL|FILEBIG

  •     NUMBERED|STRKEY|NOSERIAL|BIG|FILEBIG

  •     NUMBERED|STRKEY|FILEBIG

  •     NUMBERED|STRKEY|BIG|FILEBIG

  •     COMPRESS|UNIQUE|STRKEY|NOSERIAL

  •     COMPRESS|UNIQUE|STRKEY|NOSERIAL|BIG

  •     COMPRESS|UNIQUE|STRKEY

  •     COMPRESS|UNIQUE|STRKEY|BIG

  •     COMPRESS|UNIQUE|STRKEY|NOSERIAL|FILEBIG

  •     COMPRESS|UNIQUE|STRKEY|NOSERIAL|BIG|FILEBIG

  •     COMPRESS|UNIQUE|STRKEY|FILEBIG

  •     COMPRESS|UNIQUE|STRKEY|BIG|FILEBIG

  •     COMPRESS|STRKEY|NOSERIAL

  •     COMPRESS|STRKEY|NOSERIAL|BIG

  •     COMPRESS|STRKEY

  •     COMPRESS|STRKEY|BIG

  •     COMPRESS|STRKEY|NOSERIAL|FILEBIG

  •     COMPRESS|STRKEY|NOSERIAL|BIG|FILEBIG

  •     COMPRESS|STRKEY|FILEBIG

  •     COMPRESS|STRKEY|BIG|FILEBIG

  •     COMPRESS|NUMBERED|UNIQUE|STRKEY|NOSERIAL|BIG

  •     COMPRESS|NUMBERED|UNIQUE|STRKEY

  •     COMPRESS|NUMBERED|UNIQUE|STRKEY|BIG

  •     COMPRESS|NUMBERED|UNIQUE|STRKEY|NOSERIAL|FILEBIG

  •     COMPRESS|NUMBERED|UNIQUE|STRKEY|NOSERIAL|BIG|FILEBIG

  •     COMPRESS|NUMBERED|UNIQUE|STRKEY|FILEBIG

  •     COMPRESS|NUMBERED|UNIQUE|STRKEY|BIG|FILEBIG

  •     COMPRESS|NUMBERED|STRKEY|NOSERIAL

  •     COMPRESS|NUMBERED|STRKEY|NOSERIAL|BIG

  •     COMPRESS|NUMBERED|STRKEY

  •     COMPRESS|NUMBERED|STRKEY|BIG

  •     COMPRESS|NUMBERED|STRKEY|NOSERIAL|FILEBIG

  •     COMPRESS|NUMBERED|STRKEY|NOSERIAL|BIG|FILEBIG

  •     COMPRESS|NUMBERED|STRKEY|FILEBIG

  •     COMPRESS|NUMBERED|STRKEY|BIG|FILEBIG

  •     UNIQUE|STRKEY|NOSERIAL|EMBEDED

  •    以上还可以组合数据的类型:STRDATA、I64DATA、F64DATA、C128DATA、BYTESDATA。数据的类型属于可选项,非必须指定。

2. BsTr tree多线程安全写的脉动工作流图

   

  • 在多线程运行情况下,BsTr树的Put操作(包括插入、删除和更新)是安全的。

  • 前几个驻留协程的顺序执行是在缓冲通道的支持下进行的,因此不会阻塞等待。

  • 在最后环节,不同类型的key对应不同的驻留协程,而不同的key和不同的flag对应着不同的表,不同的表对应不同的树,也就是说,支持表级并行执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值