Caffeine缓存

目录

Caffeine相关参数

缓存大小

过期策略

填充策略

Caffeine框架中Cache的使用

同步需要手动维护——Cache

同步可设置缓存自动触发加载——LoadingCache

异步需手动维护——AsyncCache

异步可设置缓存自动触发加载——AsyncLoadingCache


在本地(进程)缓存方面,常见的缓存框架有ehcache、GuavaCache、Caffeine等方案。Caffeine是其中性能最好的一个。

Caffeine相关参数

缓存大小

使用maximumSize方法设置缓存的最大长度

过期策略

在Caffeine中有界缓存中三个设置过期方法:expireAfterAccess、expireAfterWrite、expireAfter。

  • expireAfterWrite:代表着写了之后多久过期。(上面列子就是这种方式)
  • expireAfterAccess: 代表着最后一次访问了之后多久过期。
  • expireAfter:在expireAfter中需要自己实现Expiry接口,这个接口支持create,update,以及access了之后多久过期。注意这个API和前面两个API是互斥的。这里和前面两个API不同的是,需要你告诉缓存框架,他应该在具体的某个时间过期,也就是通过前面的重写create,update,以及access的方法,获取具体的过期时间。

填充策略

Caffeine 中有三种填充策略:手动、同步和异步。

Caffeine框架中Cache的使用

基于三种不同填充策略对应提供了多种不同类型Cache提供给我们使用,下面具体看一下。

同步需要手动维护——Cache

同步是指对缓存实例中元素的get,put等操作是同步执行的;手动维护是需要我们手动显示调用API实现对实例中元素的缓存维护。

//初始化Cache对象实例
Cache<Object, Object> cache = Caffeine.newBuilder()
    .expireAfterWrite(10, TimeUnit.MINUTES)//设置过期时间为10分钟
    .maximumSize(1000)//最大长度为1000
    .build();
    
//添加(不存在)或者更新(key存在)缓存元素
cache.put(key, obj);

// 移除一个缓存元素
cache.invalidate(key);

//从cache实例中获取key对应的缓存value 如果不存在key返回null
Object obj = cache.getIfPresent(key);

//从cache实例中获取key对应的缓存value 如果不存在key就通过createObject方法生成缓存返回value,如果createObject方法执行失败返回null
Object obj = cache.get(key, k -> createObject(key));

同步可设置缓存自动触发加载——LoadingCache

LoadingCache与Cache不同的是可以在build方法中预设置一个构建缓存方法,当get方法获取的key不存在时会触发预设置的方法进行缓存的自动构建。

LoadingCache<Key, Object> cache = Caffeine.newBuilder()
    .maximumSize(10_000)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .build(key -> createObject(key));
	
	
//查找缓存,如果缓存不存在则通过createObject生成缓存元素,  如果无法生成则返回null
Object obj = cache.get(key);

//批量查找keys集合中指定的key缓存,如果缓存不存在则生成缓存元素
Map<Object, Object> map = cache.getAll(keys);

异步需手动维护——AsyncCache

异步是指对缓存实例中元素的get,put等操作是异步的方式执行的。对缓存的put操作需要手动显示调用API去维护。

AsyncCache<Key, Object> cache = Caffeine.newBuilder()
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .maximumSize(1000)
    .buildAsync();
	
//异步添加一个元素(一般直接使用get方法代替,因为是异步操作)
cache.put(key,createObjectAsync(key));	

//从cache实例中获取key对应的缓存value 如果不存在key返回null
Object obj = cache.getIfPresent(key);

//查找缓存元素,如果不存在,则异步生成
CompletableFuture<Object> obj = cache.get(key, k -> createObjectAsync(key));

异步可设置缓存自动触发加载——AsyncLoadingCache

AsyncLoadingCache与AsyncCache都是异步,但是AsyncLoadingCache可以预设置缓存构建的方法,在get获取不到时自动触发构建方法构建缓存,无须手动显示调用put方法。

AsyncLoadingCache<Key, Object> cache = Caffeine.newBuilder()
    .maximumSize(10_000)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    // 可以设置为同步操作来生成缓存元素
    .buildAsync(key -> createObject(key));
    // 也可以设置构建一个异步缓存元素操作并返回一个future
    .buildAsync((key, executor) -> createObjectAsync(key, executor));

// 查找缓存元素,如果其不存在,将会异步进行生成
CompletableFuture<Object> obj = cache.get(key);
// 批量查找缓存元素,如果其不存在,将会异步进行生成
CompletableFuture<Map<Object, Object>> graphs = cache.getAll(keys);

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WannaRunning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值