文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java中TimedCache带时间缓存工具类怎么用

2023-06-25 11:19

关注

这篇文章主要为大家展示了“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>

简单使用

不多说了,上代码。

import cn.hutool.cache.CacheUtil;import cn.hutool.cache.impl.TimedCache;import cn.hutool.core.thread.ThreadUtil; public class TimedCacheUtils {  private static final TimedCache<String, String> TIMED_CACHE = CacheUtil.newTimedCache(5000);   static {        TIMED_CACHE.schedulePrune(5);  }     public static void put(String key, String value, Long timeout) {        TIMED_CACHE.put(key, value, timeout);  }     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();  }}

首先我们看一下执行的效果

Java中TimedCache带时间缓存工具类怎么用

说明:

设置的超时时间为3000毫秒,所以第一次打印在2秒钟,所以可以获取到值。

因为第一次打印调用了get方法,刷新了过期时间,所以依然可以获取到值。

第三次打印在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();

执行结果如下:

Java中TimedCache带时间缓存工具类怎么用

工具优化-监听过期、增加回调

我们在使用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; public class TimedCacheUtils {  private static final TimedCache<String, String> TIMED_CACHE = CacheUtil.newTimedCache(5000);    private static final ExecutorService executorService = Executors.newCachedThreadPool();   private static final ListeningExecutorService listeningExecutorService =      MoreExecutors.listeningDecorator(executorService);    private static ConcurrentHashMap<String, Consumer<String>> callbackMap;     public static void put(String key, String value, Long timeout, Consumer<String> consumer) {    TIMED_CACHE.put(key, value, timeout);    addListen(key, consumer);  }     public static String get(String key) {    return TIMED_CACHE.get(key);  }     public static void remove(String key) {    callbackMap.remove(key);    TIMED_CACHE.remove(key);  }     public static void addListen(String key, Consumer<String> consumer) {    ListenableFuture<String> listenableFuture =        listeningExecutorService.submit(            () -> {              while (TIMED_CACHE.containsKey(key)) {                ThreadUtil.sleep(500);              }              return key;            });    Futures.addCallback(        listenableFuture,        new FutureCallback<String>() {          @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带时间缓存工具类怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯