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带时间缓存工具类怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2022-03-03 21:27:27
收藏
分享
海报
0 条评论
46
上一篇:Java8如何使用CompletableFuture构建异步应用方式 下一篇:vue中怎么使用assign重置data数据
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码