Caffeine缓存原理
2024-08-14 11:46:02 0 举报
为你推荐
查看更多
Caffeine是一个高性能的Java缓存库,它采用了一种名为“异步过期”的策略来实现高效的缓存管理。当缓存项被访问时,Caffeine将立即更新过期时间,并在后台异步地过期和删除过期的缓存项。这种策略确保了缓存的实时性和高效性,避免了在访问缓存项时进行同步过期操作的性能开销。Caffeine还提供了多种缓存驱逐策略,包括基于大小、时间、引用和逐出器算法的策略,以适应不同的应用场景。此外,Caffeine的API设计简洁直观,易于使用和理解,使得开发人员能够轻松地将其集成到自己的项目中。
作者其他创作
大纲/内容
writeBuffer放入AddTask
如果因为过期/GC/允许有值更新导致数据变动writeBuffer放入UpdateTask
选出窗口淘汰的node(第一个从WindowDeque中移除的node)记为candidate
写入writeOrderDeque尾部
N
getOpaqueStatus
从writeBuffer队列中取出任务
写入accessOrderWindowDeque尾部
evictionLockunlock
setStatus为PROCESSING_TO_REQUIRED(2)
readBuffer
drainStatus
cas修改为REQUIRED
不存在
够用
取数次数是否超过上限
状态为PROCESSING_TO_REQUIRED
调整窗口大小
PROCESSING_TO_IDLE(2)PROCESSING_TO_REQUIRED(3)
结束
未超过
不够用
异步执行清理任务
scheduleDrainBuffers
文本
put
状态为PROCESSING_TO_IDLE
有效
记录miss
处理弱/软应用value
scheduleDrainBuffers调度清理任务
判断是否需要缓存驱逐(容量或权重)
处理过期节点
设置已使用窗口权重
candidate和victim往下链,继续pk淘汰,直到容量够用
写入后调度
频次计数器按需进行扩容
node=next 在WindowDeque中往下链
处理驱逐节点
getIfPresent
写入accessOrderProbationDeque尾部(试用期队列)
accessOrderWindowDeque
如果node在window队列中,调整顺序
从accessOrderWindowDeque头部获取node(未移除)
readBuffer放入node
处理弱/软应用key
从accessOrderWindowDeque移除node
调度清理任务
记录读取顺序,用于缓存淘汰(容量)
如果node在probation队列中,从probation队列移除,加入到protect队列中
evictionLocklock
不为空
总容量是否够用
setStatus为PROCESSING_TO_IDLE(2)
存在
频次计数器+1
accessOrderProtectDeque
缓存key和value会进行封装value会被封装为node
窗口容量是否够用
任务是否为空
drainStatus=REQUIRED
执行AddTask
处理软弱引用GC的情况
如果node在protect队列中,调整顺序
设置已使用权重大小
原node是否还有效
node是否存在
计数器加1
状态为IDLE
drainStatus=REQUIRED或者IDLE + readbuffer满了
此队列记录了写入的顺序,当过期时间固定时,写入的顺序和过期的顺序一致,用作淘汰节点
处理readBuffer
调整窗口
candidateFreq > victimFreq 淘汰victimFreqcandidateFreq>=6 随机淘汰剩余情况,淘汰candidateFreq
超过
从accessOrderProbationDeque头部获取node(未移除)记为victim
writeBuffer
IDLE(0) 标识清理任务结束了(清理服务空闲了)REQUIRED(1) 标识清理任务结束了(清理服务空闲了),但是还有数据没有处理完全。PROCESSING_TO_IDLE(2) 标识清理任务处理中(清理服务运行中),处理完服务将进入到空闲状态。font color=\"#e74f4c\
主存驱逐(99%)
无效
cas修改为PROCESSING_TO_REQUIRED
窗口驱逐(1%)
状态为REQUIRED
Y
获取访问频次
记录命中,readBuffer放入node
执行accessPolicy
scheduleAfterWrite写入后调度
处理过期的情况
accessOrderProbationDeque
处理writeBuffer
evictionLocktryLock
为空
原node是否存在
是否正在移除任务重,如果在,则重试等待移除,重试超过1024次之后,报错
node是否过期或被GC掉
执行任务
writeOrderDeque
收藏
0 条评论
回复 删除
下一页