bigqueue 源码阅读

2019/03/18

grandecola/bigqueue 源码阅读

依赖

也是 bigqueue 作者写的一个 mmap 的 go 实现。

在博客 tiedot 阅读笔记(一) 里面,tidot 也是使用了一个 go 实现的 mmap 库,不过 tiedot 用的是 edsrzf/mmap-go

文件和数据结构

bigqueue 的数据都是存在文件中的,具体如下:

  1. 所有的文件都是在一个文件夹中
    • 这个文件在创建 BigQueue 对象的时候指定 NewBigQueue(path)
  2. 文件类型只有两种
    • 文件 index.dat
      • 存储 5 个数据(共 40bytes)
        • 第一个 8 字节存储第一个数据块所在的文件 id
        • 第二个 8 字节存储第一个数据块在文件中的 offset
        • 第三个 8 字节存储最后一个数据块所在的文件 id
        • 第四个 8 字节存储最后一个数据块在文件中的 offset
        • 第五个 8 字节存储的是单个文件的大小(数据文件,默认 128M,可以通过配置修改)
    • 文件 arena_.dat
      • id 从 0 开始
      • 文件内容由数据块组成
      • 由于数据块的寻址地址由 index.dat 指定,所以文件中除了数据块,没有其他数据(如没有索引数据,没有分隔数据)
      • 每个数据块由两部分组成
        • 数据块的长度,一个 uint64 类型,8 字节
        • 实际的数据,len(body) 字节

怎么写入数据

  1. 通过 index.dat 找到最后一个数据块所在的文件 id 和 offset
  2. 写入数据长度(如果文件剩余空间不够,少于 8 字节,则写入下一个文件首部)
  3. 写入数据(for-loop 写,记录已经写入的长度,等于 length 的时候,退出)
  4. 更新最后一个数据块所在的文件 id 和 offset

怎么读数据

  1. 通过 index.dat 找到第一个数据块所在的文件 id 和 offset
  2. 读 length(如果文件剩余空间不够,少于 8 字节,则从下一个文件首部读)
  3. 根据 length 读这么长的数据
  4. 如果不是仅读,更新第一个数据块所在的文件 id 和 offset

有啥总结的