Freecache 介绍
FreeCache 是一个 Go 语言的缓存库,无额外的 GC 负荷 。数百万对象的垃圾收集延迟仅在数百毫秒 。您可以在内存中缓存无限数量的对象,而不会增加延迟和降低吞吐量
特征:
可存储数以百万计条目零垃圾收集负荷高并发而且线程安全的访问纯 Go 语言实现支持对象失效近乎 LRU 的算法严格限制内存使用提供一个测试用的服务器,支持一些基本 Redis 命令
存储结构示意图:
(图片摘自网络)
存储结构文字说明:
首先分配一个cache 氛围 256 个segmentsegment 里面包换一个ringbuffersegment包换一个数组 slotsData 用来村组对应key和value在ringbuffer 中保存的位置
主要结构分析:
type segment struct {
rb RingBuf // ring buffer that stores data
segId int
_ uint32
missCount int64
hitCount int64
entryCount int64
totalCount int64 // 存储的key的总数据,包括应删除的key
totalTime int64 // 保存key 是时间累加,主要用于回收key
timer Timer // Timer giving current time
totalEvacuate int64 // used for debug
totalExpired int64 // used for debug
overwrites int64 // used for debug
vacuumLen int64 // 最大存储长度,限制内存使用,当存储的可以所需内存 >vacuumLen 会触发内存储项目回收,注意相对应的ringbuffer 会被设置为已删除
slotLens [256]int32 // key hash碰撞后冲突的长度
slotCap int32 // key hash碰撞后冲突key 最大容量 当 slotLens = slotCap slotsData 就会扩容 这也是freecache 内存不受控制的地方
slotsData []entryPtr // shared by all 256 slots
}
type entryHdr struct {
accessTime uint32 // 最近一次访问kv记录的时间
expireAt uint32 // 过期时间
keyLen uint16 //
hash16 uint16 // 当前entry所在slot的位置
valLen uint32
valCap uint32 // 当前entry所能容纳的val的最大长度,
// 如果重复写入的value小于这个值会直接在当前位置写入,
// 否则会就删除原来的数据,重新存入 deleted bool
// 为了避免不必要的内存拷贝,删除的时候并不会移动其他kv结构来覆盖当前kv,
// 而只是通过这个标记来识别当前kv是无用的
slotId uint8 // 当前entry所在的slot
reserved uint16
}
type entryPtr struct {
offset int64 // 由于ringbuff就是一个字节数组,所以在其中定位一个kv必然需要一个偏移量 。hash16 uint16 // 我们知道slot中可能并非只有一个entry,这是由于我们的slot是有限的 。
// 当key多到一定程度时,hash之后必然会出现冲突,不同的key定位到同一个slot,
// 因此就必然会存放多个entry 。这些entry是按这里的hash16的大小排序存放的,
// 所以查找O(logn) 二分查找
keyLen uint16 // 该entry中存放的kv记录的key的长度,主要用于比较是否是要查找的key 。reserved uint32 // 对齐字段
}
set
一般步骤
根据key的hash值的低16位作为索引定位到某个segment 。segId := hashVal & 255定位segment的slot:slotId := uint8(hashVal ? 8)定位key对应的entry:seg.lookup(slot, hash16, key)如果该key已经存在了:当value的长度不大于之前value的长度(valCap),那么直接在当前位置写入kv记录否则,就删除原来数据(ringbuffer 中数据职位deleted=true,slotsData 进行重组,slotLens减一检查当前ringbuff的空间是否满足将当前kv记录存入,是则插入否则按LRU算法淘汰部分则插入从ringbuffer 最早写入开始检查是否能删除,如果是已经删除或者已经过期当有效并且连续五次挪动key,就删除 检查的key存入key 计算 slotLens长度,判断是否扩容
推荐阅读
- 辣木籽的作用和功效是什么样的 辣木籽泡水喝的功效作用
- 蓝莓干泡水是什么颜色的 蓝莓干泡水是什么颜色
- 绿豆不能打出浆是什么原因
- 双跳灯是什么
- 冷冻鱼保水剂有毒吗-冻鱼里的保水剂是什么成分
- 多肉化水还有救吗-多肉化水原因是什么
- 洗衣机洗到中途停是什么问题-洗衣机洗一半不想洗了怎么办
- 铸铁锅和生铁锅的区别是什么
- 伯仲局是什么意思 伯仲局的含义
- 九个必须的具体内容是什么