广告
返回顶部
首页 > 资讯 > 精选 >Java中TimedCache带时间缓存工具类怎么用
  • 497
分享到

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

2023-06-25 11:06:19 497人浏览 薄情痞子
摘要

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

简单使用

不多说了,上代码。

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

--结束END--

本文标题: Java中TimedCache带时间缓存工具类怎么用

本文链接: https://www.lsjlt.com/news/304166.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中TimedCache带时间缓存工具类怎么用
    这篇文章主要为大家展示了“Java中TimedCache带时间缓存工具类怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中TimedCache带时间缓存工具类怎么用”这篇文章吧。简述...
    99+
    2023-06-25
  • Java TimedCache 带时间缓存工具类详解使用
    简述 我们在工作中会碰到需要使用带过期时间的缓存场景。但是使用redis有太重了,毕竟缓存的数据很小,放在内存够够的。hutools提供了TimedCache时间缓存工具,可以实现该...
    99+
    2022-11-12
  • Java本地缓存工具LoadingCache怎么使用
    这篇文章主要介绍“Java本地缓存工具LoadingCache怎么使用”,在日常操作中,相信很多人在Java本地缓存工具LoadingCache怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java本...
    99+
    2023-06-22
  • SpringBoot下集成缓存工具类CacheManager怎么使用
    这篇文章主要介绍了SpringBoot下集成缓存工具类CacheManager怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot下集成缓存工具类CacheManager怎么使用文章都会有...
    99+
    2023-07-05
  • 利用Java怎么实现一个超时工具类
    本文章向大家介绍利用Java怎么实现一个超时工具类的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程...
    99+
    2023-06-06
  • 如何在java中使用DateUtils工具类对时间进行转换
    本文章向大家介绍如何在java中使用DateUtils工具类对时间进行转换,主要包括如何在java中使用DateUtils工具类对时间进行转换的使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。J...
    99+
    2023-05-30
    java dateutils
  • Java中Arrays数组工具类怎么用
    小编给大家分享一下Java中Arrays数组工具类怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!方法一览表方法名简要描述asList()返回由指定数组支持的...
    99+
    2023-06-25
  • FileUploadUtil工具类怎么在Java项目中使用
    本篇文章为大家展示了FileUploadUtil工具类怎么在Java项目中使用 ,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。具体内容如下package com.gootrip.util;impor...
    99+
    2023-05-31
    java fileuploadutil ava
  • 怎么在Java中导出Excel通用工具类
    今天就跟大家聊聊有关怎么在Java中导出Excel通用工具类,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、构建pom.xml我们的工程是利用Maven来构建的,项目具体搭建过程大...
    99+
    2023-06-14
  • Java中Char的简单工具类CharUtil怎么用
    这篇文章主要介绍Java中Char的简单工具类CharUtil怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!char,java基本数据类型之一,底层保存的的是两个字节的int整数。默认显示的是Unicode这个...
    99+
    2023-05-30
    java char charutil
  • python函数运行内存时间等性能检测工具怎么用
    这篇“python函数运行内存时间等性能检测工具怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python函数运行内存...
    99+
    2023-06-30
  • java中怎么使用CollectionUtils工具类判断集合是否为空
    本篇内容介绍了“java中怎么使用CollectionUtils工具类判断集合是否为空”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用Co...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作