- 高性能key-value分布缓存,多线程,主线程/工作线程
- slab机制
- slab->trunk->item 默认slab1M
- trunk size 递增
- freelist LRU
- 通过hashtable定位key
- 单向链表解决冲突
- 高性能特性,单节点百万级QPS
系统架构
- 网络处理
- libevent,多路复用io,epoll
- LRU
- 分段LRU
- temp LRU 新增小于61s直接进入
- hot LRU 新增大于等于61s 内存占所在slabclass小于20%
- warm LRU 被访问迁移到对头,否则迁移到cold LRU 小于40%
- cold LRU 被访问迁移到warm LRU,否则剔除
- 分段LRU
- Slab
- 64个slabclass 1-63做存储 0做分配
- 所有slab大小相同,默认1M
- 相同slabclass trunk size仙童
- slabclass 随id 增加因子增大
- item一般不会填满trunk,但浪费空间可忽略
- 通过freelist管理空闲trunk
- hashtable扩容 2倍扩容
网络模型
- libevent多线程网络模型
- 主线程连接调度给worker线程,通过管道发送通知
- 工作线程接受通知,队列获取新连接,读取cmd,解析处理,返回rsp
- 状态机 swtich case实现 主线程负责acccpet 和调度工作 tcp文本协议
key定位
- hash计算定位
- 哈希冲突,每个桶链表解决hash冲突
淘汰策略
- key过期
- flush_all 所有key失效
- 删除回收
- 惰性删除 查询校验过期时间是否过期
- item内存分配失败,lru对位扫描,没有失效,队尾强制删除
- LRU维护线程,LRU异步淘汰