Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > go内存缓存BigCache封装Entry

go内存缓存BigCache封装Entry源码解读

作者:海生

这篇文章主要为大家介绍了go内存缓存BigCache封装Entry源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

bigcache存储

在bigcache存储中,数据值存储的形式为[]byte。

我们通过一个,存储的时候,同时会把 hash值,key长度以及值,时间戳,entry同时存起来。

我们可以简称为 header + entry

header的存储大小为 20字节 [20]byte

每个entry由5部分组成,分别是时间戳(8byte)、key的hash值(8byte)、key的长度(2byte)、key的值本身以及value的值本身。

这里通过小端字节序来存储,所以后续的反编译也应该指定这种模式。从PutUint64、PutUint16也可以对应到字节的大小。

对应源码

binary.LittleEndian.PutUint64(blob, timestamp)
    binary.LittleEndian.PutUint64(blob[timestampSizeInBytes:], hash)
    binary.LittleEndian.PutUint16(blob[timestampSizeInBytes+hashSizeInBytes:], uint16(keyLength))
    copy(blob[headersSizeInBytes:], key)
    copy(blob[headersSizeInBytes+keyLength:], entry)

通过wrapEntry()函数封装

const (
    timestampSizeInBytes = 8                                                       // Number of bytes used for timestamp
    hashSizeInBytes      = 8                                                       // Number of bytes used for hash
    keySizeInBytes       = 2                                                       // Number of bytes used for size of entry key
    headersSizeInBytes   = timestampSizeInBytes + hashSizeInBytes + keySizeInBytes // Number of bytes used for all headers
)
func wrapEntry(timestamp uint64, hash uint64, key string, entry []byte, buffer *[]byte) []byte {
    keyLength := len(key)
    blobLength := len(entry) + headersSizeInBytes + keyLength
    if blobLength > len(*buffer) {
        *buffer = make([]byte, blobLength)
    }
    blob := *buffer
    binary.LittleEndian.PutUint64(blob, timestamp)
    binary.LittleEndian.PutUint64(blob[timestampSizeInBytes:], hash)
    binary.LittleEndian.PutUint16(blob[timestampSizeInBytes+hashSizeInBytes:], uint16(keyLength))
    copy(blob[headersSizeInBytes:], key)
    copy(blob[headersSizeInBytes+keyLength:], entry)
    return blob[:blobLength]
}

以上就是go内存缓存BigCache封装Entry源码解读的详细内容,更多关于go内存缓存BigCache封装Entry的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文