caffenie

缓存组件的命中率关键在于数据淘汰算法,如FIFO、LRU、LFU等。Caffeine是一个基于JDK1.8的高性能缓存工具,采用W-TinyLFU算法实现高命中率,适用于内存缓存场景。其支持手动、同步、异步的缓存填充策略,并采用惰性过期策略,可配合定时清理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缓存算法:一个缓存组件是否好用,一个重要指标是缓存命中率,而命中率
和缓存组件本身的缓存数据淘汰算法息息相关
1、FIFO:先进先出,类似队列。即如果一个数据是最先进入的,可以认为在将来
它被访问的可能性很小。空间满的时候,最先进入的数据会被最早淘汰

	 缺页率=(页面置换次数+分配给该进程的物理块数)/要访问的页面总数
	 
	 Belady现象:一个进程P要访问M个页,OS分配N(N<M)个内存页面,对一个访问序列S,发生
				缺页的次数PE(S,N)。当N增大时,PE时而增大,时而减小。简言之就是说
				分配的页面增多,但缺页率反而提高
				
	FIFO,被置换的页面通常使被频繁访问的,会使一些页面频繁的被替换和重新申请内存,
	导致Belady现象

2、LRU:The Least Recently Used,最近最久未使用算法。如果一个数据最近一段时间都没有被访问,
认为它将来被访问的可能性也很小。当空间满时,最久没有被访问的数据最先被置换。

	最朴素的实现思想使数组+时间戳,不过效率较低
	可以用双线链表LinkedList+哈希表HashMap实现,链表表示位置,哈希表用来存储和查找。
	Java里有对应的数据结构LinkedHashMap

3、LFU: Least Frequently Used,最近最少使用算法。如果一个数据在最近一段时间很少被访问,可以认为在将来它被访问的可能性也很小,
空间满时,最小频率访问的数据最先被淘汰

	实现策略:小顶堆(选择频率最小的元素)+哈希表
	
	堆其实是利用完全二叉树的结构来维护的一维数组
	大顶堆:每个结点的值都大于或等于其左右孩子结点的值
	小顶堆:每个结点的值都小于或等于其左右孩子结点的值
	升序排列用大顶堆,降序用小顶堆

4、W-TinyLFU

1、caffeine是基于jdk1.8实现的缓存工具
2、caffeine使用W-TinyLFU算法,实现几乎完美的命中率
3、是一种内存缓存,适合单机的数据缓存;因为存储在内存中,没有持久化,
适合一些短期或者启动以及结果信息的暂存。
4、缓存填充策略:手动、同步、异步
4.1 手动控制缓存的增删改处理。底层用ConcurrentHashMap进行节点存储,
因此get()方法是安全的。批量查找可以用getAllPresent()或带填充默认值的getAll()
4.2 同步加载

5、过期策略:caffeine的缓存清除是惰性的,类似redis的惰性删除。可以通过增加定时器
的方法,定时执行cache.cleanUp()——一个异步方法,可以等待执行。出发缓存清除操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值