java 清理页面缓存数据_Java:本地缓存之google guava cache 使用之数据清理

本文介绍了Java中Google Guava Cache的数据清理策略,包括基于缓存对象大小的驱逐、基于时间的驱逐以及刷新缓存的概念。通过设置maximumSize、maximumWeight和expireAfterWrite等参数,实现缓存数据的自动管理和过期处理。此外,还讨论了刷新与驱逐的区别,以及如何实现异步刷新。
摘要由CSDN通过智能技术生成

现实中,不可能把所有的数据全部放到内存中。您必须决定:什么时候不值得保留缓存条目?guava提供了三种基本类型的数据驱逐:基于缓存对象大小的驱逐、基于时间的驱逐和基于引用的驱逐。

基于缓存对象大小(权重)的驱逐

如果你的缓存对象数量不会增长超过一定的大小,只需使用CacheBuilder.maximumSize(long)。缓存将尝试逐出没有被经常访问的数据。逐出操作会在对象数量接近限制的时候发生。

同时,你可以为不同的对象设置不同的权重,

CacheBuilder.weigher(Weigher)定义缓存对象的权重值方法,

CacheBuilder.maximumWeight(long)定义权重最大值。权重仅仅在创建的时候计算,之后都是静态的值。

public GuavaCache() {

cache = CacheBuilder.newBuilder()

.weigher((String key,GuavaCacheData value) -> value.weight())

.maximumWeight(1000)

.build(new CacheLoader(){

@Override

public GuavaCacheData load(String key) throws ExecutionException {

//获取数据

try {

//这里仅仅模拟获取数据非常慢,不要使用该代码

Thread.sleep(2000L);

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

}

return new GuavaCacheData(key);

}

});

}

基于时间的驱逐

基于时间的驱逐分为2种

1)expireAfterAccess(long, TimeUnit),当缓存对象上次访问时间超过一段时间后被驱逐

2)expireAfterWrite(long, TimeUnit),当缓存对象写入后超过一段时间后被驱逐,这个非常常用

定时过期对象在写入期间执行定期维护,偶尔在读取期间执行。

刷新缓存

刷新缓存不等于驱逐缓存。

正如LoadingCache.refresh(K)中所指定的,刷新密钥将为密钥加载一个新值,可能是异步的。刷新密钥时仍返回旧值(如果有),而逐出则强制检索等待重新加载该值。

如果在刷新时引发异常,则保留旧值,并记录和吞入异常。

CacheLoader可以通过重写CacheLoader.reload(K,V)指定刷新时使用的智能行为,这允许您在计算新值时使用旧值。

// Some keys don't need refreshing, and we want refreshes to be done asynchronously.

LoadingCachegraphs = CacheBuilder.newBuilder()

.maximumSize(1000)

.refreshAfterWrite(1, TimeUnit.MINUTES)

.build(

new CacheLoader() {

public Graph load(Key key) { // no checked exception

return getGraphFromDatabase(key);

}

public ListenableFuturereload(final Key key, Graph prevGraph) {

if (neverNeedsRefresh(key)) {

return Futures.immediateFuture(prevGraph);

} else {

// asynchronous!

ListenableFutureTasktask = ListenableFutureTask.create(new Callable() {

public Graph call() {

return getGraphFromDatabase(key);

}

});

executor.execute(task);

return task;

}

}

});

可以使用CacheBuilder.refreshAfterWrite(long,TimeUnit)将自动定时刷新添加到缓存中。与expireAfterWrite相反,refreshAfterWrite将使密钥在指定的持续时间后符合刷新条件,但只有在查询条目时才实际启动刷新。(如果CacheLoader.reload被实现为异步的,那么查询不会因为刷新而变慢。)例如,您可以在同一个缓存上同时指定refreshAfterWrite和expireAfterWrite,这样当一个条目符合刷新条件时,条目上的过期计时器就不会盲目地重置,所以如果没有查询条目当它符合刷新条件后,就可以过期了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值