返回顶部
首页 > 资讯 > 后端开发 > Python >Java TimedCache 带时间缓存工具类详解使用
  • 523
分享到

Java TimedCache 带时间缓存工具类详解使用

2024-04-02 19:04:59 523人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

简述 我们在工作中会碰到需要使用带过期时间的缓存场景。但是使用Redis有太重了,毕竟缓存的数据很小,放在内存够够的。hutools提供了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();
  }
}

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

说明:

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;
 

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();
  }
}

执行结果:

说明:

1、可以看到监听到缓存过期,并进行了回调。

总结

具体的工具类使用场景,因项目而异,大家看着来。

如果本文对你有帮助,请点个赞支持一下吧。

到此这篇关于Java TimedCache 带时间缓存工具类详解使用的文章就介绍到这了,更多相关Java TimedCache内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java TimedCache 带时间缓存工具类详解使用

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

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

猜你喜欢
  • Java TimedCache 带时间缓存工具类详解使用
    简述 我们在工作中会碰到需要使用带过期时间的缓存场景。但是使用redis有太重了,毕竟缓存的数据很小,放在内存够够的。hutools提供了TimedCache时间缓存工具,可以实现该...
    99+
    2024-04-02
  • Java中TimedCache带时间缓存工具类怎么用
    这篇文章主要为大家展示了“Java中TimedCache带时间缓存工具类怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中TimedCache带时间缓存工具类怎么用”这篇文章吧。简述...
    99+
    2023-06-25
  • java DateUtil工具类时间戳类型转换详解
    本文实例为大家分享了DateUtil工具类时间戳类型转换的具体代码,供大家参考,具体内容如下package com.sinosoft.media.sms.util; import java.text.ParseException; impo...
    99+
    2023-05-30
    java dateutil dat
  • Java本地缓存工具之LoadingCache的使用详解
    目录前言环境依赖代码演示一下总结前言 在工作总常常需要用到缓存,而redis往往是首选,但是短期的数据缓存一般我们还是会用到本地缓存。本文提供一个我在工作中用到的缓存工具,该工具代码...
    99+
    2024-04-02
  • vue日期时间工具类详解
    最近做的一个项目对日期时间的处理比较多,最后整理到一个工具类里面,方便以后使用: 1. 在utils文件夹下新建一个dateTimeUtil.js文件: // 获取当前时间并格式化 ...
    99+
    2024-04-02
  • JAVA时间存储类Period和Duration使用详解
    目录前言Period类实例化设置值其它APIDuraction类其它API前言 在JDK1.8中区分了时间和日期的概念,所以有了两个对应的类,LocalDate和LocalTime,...
    99+
    2024-04-02
  • Hutool工具类使用详解
    当今,Java开发者需要处理各种各样的任务,这包括但不限于:日期操作、加密算法、文件操作、Excel数据处理、网络请求等等。而在处理这些任务时,为了提高效率、降低开发难度和复杂度,我们需要借助一些工具类库。Hutool是一个Java工具类库...
    99+
    2023-08-25
    java 开发语言
  • 时间处理工具 dayjs使用示例详解
    目录特点安装和使用dayjs 的基本架构基本用法国际化使用插件小结特点 在 dayjs 之前,还有一个时间处理工具 moment.js,但是它的体积比较大,即使经过压缩压缩之后依然有...
    99+
    2022-11-13
    时间处理工具 dayjs 时间处理 dayjs
  • Java本地缓存工具LoadingCache怎么使用
    这篇文章主要介绍“Java本地缓存工具LoadingCache怎么使用”,在日常操作中,相信很多人在Java本地缓存工具LoadingCache怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java本...
    99+
    2023-06-22
  • Java时间戳类Instant的使用详解
    目录前言Instant类时间点时间表示Instant实例化Instant获取参数Instant时间点比较Instant时间点运算前言 在JAVA8之前的版本,去获取时间戳(毫秒级别)...
    99+
    2024-04-02
  • Java常用时间工具类总结(珍藏版)
    目录常量介绍相关方法工具类源码肝了两天,重新整理了下时间工具类,以后我就以该时间工具类进行项目开发了,后会不定期更新功能,也欢迎留言需求,让工具类不断的完善。 常量介绍 相关方法 ...
    99+
    2024-04-02
  • 如何使用hutool做本地缓存的工具类
    目录用hutool做本地缓存的工具类gradle中引入hutool依赖本地缓存工具类关于hutools工具包的常用方法HttpUtil类用hutool做本地缓存的工具类 gradle...
    99+
    2022-11-13
    使用hutool工具类 本地缓存工具类 工具类
  • SpringBoot下集成缓存工具类CacheManager怎么使用
    这篇文章主要介绍了SpringBoot下集成缓存工具类CacheManager怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot下集成缓存工具类CacheManager怎么使用文章都会有...
    99+
    2023-07-05
  • 图文详解Windows下使用Redis缓存工具的方法
    一、简介 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。 这些...
    99+
    2022-06-04
    缓存 详解 图文
  • Java轻松使用工具类实现获取wav时间长度
    获取wav格式音频时长。 Maven依赖 <dependency> <groupId>org</groupI...
    99+
    2024-04-02
  • Java 日期时间工具包–java.time的使用
    目录日期和时间now()of()plus()minus()时区格式化从JDK8开始,Java 提供了新的日期时间处理方法用来代替旧的日期类(Date)。本章主要讲它们的用法以及和旧日...
    99+
    2024-04-02
  • Java时间工具类Date的常用处理方法
    目录前言Date 类构造方法常用方法前言 Date 类 Date 类表示系统特定的时间戳,可以精确到毫秒。Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。 构造方法...
    99+
    2024-04-02
  • Java中Date日期时间类具体使用
    目录日期比较使用 SimpleDateFormat 格式化日期日期和时间的格式化编码使用printf格式化日期解析字符串为时间休眠(sleep)Calendar类GregorianC...
    99+
    2023-05-17
    Java Date日期时间类 Java 日期时间类
  • 如何在java中使用DateUtils工具类对时间进行转换
    本文章向大家介绍如何在java中使用DateUtils工具类对时间进行转换,主要包括如何在java中使用DateUtils工具类对时间进行转换的使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。J...
    99+
    2023-05-30
    java dateutils
  • java时间戳与日期相互转换工具详解
    本文为大家分享了java日期与时间戳相互转换大全,供大家参考,具体内容如下package com.crm.util; import java.math.BigDecimal; import java.text.DecimalFormat;...
    99+
    2023-05-30
    java 时间戳 日期
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作