一、介绍
BytesQueue构造,是bigcache真正数据存储的中央。
在 bigCache 中,所有的 value 都是存在一个 BytesQueue 中的,从实现可知,所有的用户存储数据经由序列化后存入 array []byte
// BytesQueue is a non-thread safe queue type of fifo based on bytes array.// BytesQueue 是基于字节数组的非线程平安队列类型的FIFO。// For every push operation index of entry is returned. It can be used to read the entry later// 对于每个推送操作索引,都会返回。它可用于稍后浏览条目。type BytesQueue struct { full bool array []byte // 真正存储数据的中央 capacity int // array 的容量 maxCapacity int // array 可申请的最大容量 head int tail int // 下次能够插入 item 的地位 count int // 以后插入的 item 数量 rightMargin int headerBuffer []byte // 插入前做长期 buffer 所用(slice-copy) verbose bool // 打印 log 开关}
初始化BytesQueue的办法为
func NewBytesQueue(capacity int, maxCapacity int, verbose bool) *BytesQueue { return &BytesQueue{ array: make([]byte, capacity), // 真正存储数据的中央,长度为capacity,间接初始化每个值 capacity: capacity, maxCapacity: maxCapacity, headerBuffer: make([]byte, binary.MaxVarintLen32), tail: leftMarginIndex, head: leftMarginIndex, rightMargin: leftMarginIndex, verbose: verbose, }}
咱们通过保护上面几个变量来实现存储位移及标识:head
:起始地位(也能够了解为,以后最老的数据的地位,删除的逻辑从这个地位开始)tail
:下次能够插入 item 的地位capacity
:标识 array 的容量count
:以后曾经插入的 item 的数量maxCapacity
:标识 array 能够申请的最大容量rightMargin
:用于标识队列中最初一个元素的地位,是一个相对地位。leftMarginIndex
:常量,值为 1,标识队列的结尾地位(0 号不必)
留神, head 和 tail 以及 rightMargin 的初始值都是 leftMarginIndex。BytesQueue 应用 []byte 类型来模仿队列,插入数据从 tail 地位,删除数据从 head 地位。为规范的FIFO队列。