Java中TimedCache带时间缓存工具类怎么用
Java中TimedCache带时间缓存工具类怎么用
这篇文章主要为大家展示了“Java中TimedCache带时间缓存工具类怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中TimedCache带时间缓存工具类怎么用”这篇文章吧。
简述
我们在工作中会碰到需要使用带过期时间的缓存场景。但是使用redis有太重了,毕竟缓存的数据很小,放在内存够够的。hutools提供了TimedCache时间缓存工具,可以实现该场景。下面使用到该组件,并为了适配工作场景,对该工具类做优化升级。
Maven依赖
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.6</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.1.1-jre</version></dependency>
简单使用
不多说了,上代码。
importcn.hutool.cache.CacheUtil;importcn.hutool.cache.impl.TimedCache;importcn.hutool.core.thread.ThreadUtil;/**@Authorhuyi@Date2021/10/1217:00@Description:*/publicclassTimedCacheUtils{privatestaticfinalTimedCache<String,String>TIMED_CACHE=CacheUtil.newTimedCache(5000);static{/**每5ms检查一次过期*/TIMED_CACHE.schedulePrune(5);}/***存入键值对,提供消逝时间**@paramkey*@paramvalue*@paramtimeout*/publicstaticvoidput(Stringkey,Stringvalue,Longtimeout){/**设置消逝时间*/TIMED_CACHE.put(key,value,timeout);}/***每次重新get一次缓存,均会重新刷新消逝时间*@paramkey*@return*/publicstaticStringget(Stringkey){returnTIMED_CACHE.get(key);}publicstaticvoidmain(String[]args){put("haha","1",3000L);ThreadUtil.sleep(2000);//if(TIMED_CACHE.containsKey("haha")){//System.out.println("aa");//}System.out.println("第1次结果:"+get("haha"));ThreadUtil.sleep(2000);System.out.println("第2次结果:"+get("haha"));ThreadUtil.sleep(5000);System.out.println("第3次结果:"+get("haha"));//取消定时清理TIMED_CACHE.cancelPruneSchedule();}}
首先我们看一下执行的效果
说明:
1、设置的超时时间为3000毫秒,所以第一次打印在2秒钟,所以可以获取到值。
2、因为第一次打印调用了get方法,刷新了过期时间,所以依然可以获取到值。
3、第三次打印在5秒后,所以已经过期,无法获取到值,打印null。
那么,需要知道是否缓存还在可以使用containsKey方法。如下:
put("haha","1",3000L);ThreadUtil.sleep(2000);if(TIMED_CACHE.containsKey("haha")){System.out.println("第1次结果:缓存存在");}//System.out.println("第1次结果:"+get("haha"));ThreadUtil.sleep(2000);System.out.println("第2次结果:"+get("haha"));ThreadUtil.sleep(5000);System.out.println("第3次结果:"+get("haha"));//取消定时清理TIMED_CACHE.cancelPruneSchedule();
执行结果如下:
工具优化-监听过期、增加回调
我们在使用TimedCache会发现,一旦缓存过期我们并不能立马知道,很多工作场景中需要对缓存做监听回调。所以我升级了一下该工具类。
importcn.hutool.cache.CacheUtil;importcn.hutool.cache.impl.TimedCache;importcn.hutool.core.thread.ThreadUtil;importcom.google.common.util.concurrent.*;importorg.checkerframework.checker.nullness.qual.Nullable;importjava.text.MessageFormat;importjava.util.concurrent.ConcurrentHashMap;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.function.Consumer;/**@Authorhuyi@Date2021/10/1210:57@Description:时间缓存工具*/publicclassTimedCacheUtils{privatestaticfinalTimedCache<String,String>TIMED_CACHE=CacheUtil.newTimedCache(5000);/**线程池*/privatestaticfinalExecutorServiceexecutorService=Executors.newCachedThreadPool();privatestaticfinalListeningExecutorServicelisteningExecutorService=MoreExecutors.listeningDecorator(executorService);/**回调方法映射*/privatestaticConcurrentHashMap<String,Consumer<String>>callbackMap;/***存入键值对,添加过期时间,和消费回调**@paramkey*@paramtimeout*@paramconsumer*/publicstaticvoidput(Stringkey,Stringvalue,Longtimeout,Consumer<String>consumer){TIMED_CACHE.put(key,value,timeout);addListen(key,consumer);}/***获取缓存值**@paramkey*@return*/publicstaticStringget(Stringkey){returnTIMED_CACHE.get(key);}/***删除缓存和回调映射**@paramkey*/publicstaticvoidremove(Stringkey){callbackMap.remove(key);TIMED_CACHE.remove(key);}/***添加监听器**@paramkey*@paramconsumer*/publicstaticvoidaddListen(Stringkey,Consumer<String>consumer){ListenableFuture<String>listenableFuture=listeningExecutorService.submit(()->{while(TIMED_CACHE.containsKey(key)){ThreadUtil.sleep(500);}returnkey;});Futures.addCallback(listenableFuture,newFutureCallback<String>(){@OverridepublicvoidonSuccess(@NullableStrings){consumer.accept(s);}@OverridepublicvoidonFailure(Throwablethrowable){throwable.printStackTrace();}},listeningExecutorService);}publicstaticvoidmain(String[]args){put("haha","1",3000L,x->System.out.println(MessageFormat.format("[{0}]-缓存消逝",x)));ThreadUtil.sleep(2000);System.out.println(get("haha"));ThreadUtil.sleep(2000);System.out.println(get("haha"));ThreadUtil.sleep(5000);System.out.println(get("haha"));//关闭监听线程池listeningExecutorService.shutdown();}}
以上是“Java中TimedCache带时间缓存工具类怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!