Java中TimedCache带时间缓存工具类怎么用
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要为大家展示了"Java中TimedCache带时间缓存工具类怎么用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java中TimedCache
千家信息网最后更新 2025年01月16日Java中TimedCache带时间缓存工具类怎么用
这篇文章主要为大家展示了"Java中TimedCache带时间缓存工具类怎么用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java中TimedCache带时间缓存工具类怎么用"这篇文章吧。
简述
我们在工作中会碰到需要使用带过期时间的缓存场景。但是使用redis有太重了,毕竟缓存的数据很小,放在内存够够的。hutools提供了TimedCache时间缓存工具,可以实现该场景。下面使用到该组件,并为了适配工作场景,对该工具类做优化升级。
Maven依赖
cn.hutool hutool-all 5.4.6 com.google.guava guava 30.1.1-jre
简单使用
不多说了,上代码。
import cn.hutool.cache.CacheUtil;import cn.hutool.cache.impl.TimedCache;import cn.hutool.core.thread.ThreadUtil; /** @Author huyi @Date 2021/10/12 17:00 @Description: */public class TimedCacheUtils { private static final TimedCacheTIMED_CACHE = CacheUtil.newTimedCache(5000); static { /** 每5ms检查一次过期 */ TIMED_CACHE.schedulePrune(5); } /** * 存入键值对,提供消逝时间 * * @param key * @param value * @param timeout */ public static void put(String key, String value, Long timeout) { /** 设置消逝时间 */ TIMED_CACHE.put(key, value, timeout); } /** * 每次重新get一次缓存,均会重新刷新消逝时间 * @param key * @return */ public static String get(String key) { return TIMED_CACHE.get(key); } public static void main(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会发现,一旦缓存过期我们并不能立马知道,很多工作场景中需要对缓存做监听回调。所以我升级了一下该工具类。
import cn.hutool.cache.CacheUtil;import cn.hutool.cache.impl.TimedCache;import cn.hutool.core.thread.ThreadUtil;import com.google.common.util.concurrent.*;import org.checkerframework.checker.nullness.qual.Nullable; import java.text.MessageFormat;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.function.Consumer; /** @Author huyi @Date 2021/10/12 10:57 @Description: 时间缓存工具 */public class TimedCacheUtils { private static final TimedCacheTIMED_CACHE = CacheUtil.newTimedCache(5000); /** 线程池 */ private static final ExecutorService executorService = Executors.newCachedThreadPool(); private static final ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(executorService); /** 回调方法映射 */ private static ConcurrentHashMap > callbackMap; /** * 存入键值对,添加过期时间,和消费回调 * * @param key * @param timeout * @param consumer */ public static void put(String key, String value, Long timeout, Consumer consumer) { TIMED_CACHE.put(key, value, timeout); addListen(key, consumer); } /** * 获取缓存值 * * @param key * @return */ public static String get(String key) { return TIMED_CACHE.get(key); } /** * 删除缓存和回调映射 * * @param key */ public static void remove(String key) { callbackMap.remove(key); TIMED_CACHE.remove(key); } /** * 添加监听器 * * @param key * @param consumer */ public static void addListen(String key, Consumer consumer) { ListenableFuture listenableFuture = listeningExecutorService.submit( () -> { while (TIMED_CACHE.containsKey(key)) { ThreadUtil.sleep(500); } return key; }); Futures.addCallback( listenableFuture, new FutureCallback () { @Override public void onSuccess(@Nullable String s) { consumer.accept(s); } @Override public void onFailure(Throwable throwable) { throwable.printStackTrace(); } }, listeningExecutorService); } public static void main(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带时间缓存工具类怎么用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
缓存
时间
工具
结果
监听
内容
场景
方法
篇文章
工作
第一次
线程
升级
学习
帮助
上代
内存
效果
数据
易懂
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
购买服务器的优缺点
数据库分析师怎么样
重构mysql数据库
软件开发2球78 86 7
ios软件开发工具下载
管理阿里linux服务器
专业做政务软件开发的公司
高防100g服务器多少圈
武汉微信分销系统软件开发
软件开发助理 面试
国三网络技术静态路由
小公司刀片服务器
暴雪手游无法连接服务器
车载网络技术课程
软件开发很难学会的
删除数据库对象的关键字是
智能巡检管理系统数据库
10nm服务器跑分多少
零基础学服装的软件开发
养父下载软件开发
网络安全100字小学
数据库多个文件管理
dns服务器设置错误
网络安全法哪一项是重点保护
中小字生家庭教育与网络安全直播
容天服务器驱动
linux服务器操作日志
华为网络安全治理的机构
计算机网络技术自考视频
957网络技术基础难吗