最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java TimedCache 帶時(shí)間緩存工具類詳解使用

 更新時(shí)間:2021年10月27日 16:31:59   作者:劍客阿良_ALiang  
工具類是包含集合框架、遺留的 collection 類、事件模型、日期和時(shí)間設(shè)施、國(guó)際化和各種實(shí)用工具類(字符串標(biāo)記生成器、隨機(jī)數(shù)生成器和位數(shù)組、日期Date類、堆棧Stack類、向量Vector類等)。集合類、時(shí)間處理模式、日期工具等各類常用工具包,本文將介紹帶時(shí)間緩存工具類

簡(jiǎn)述

我們?cè)诠ぷ髦袝?huì)碰到需要使用帶過(guò)期時(shí)間的緩存場(chǎng)景。但是使用redis有太重了,畢竟緩存的數(shù)據(jù)很小,放在內(nèi)存夠夠的。hutools提供了TimedCache時(shí)間緩存工具,可以實(shí)現(xiàn)該場(chǎng)景。下面使用到該組件,并為了適配工作場(chǎng)景,對(duì)該工具類做優(yōu)化升級(jí)。

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>

簡(jiǎn)單使用

不多說(shuō)了,上代碼。

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 TimedCache<String, String> TIMED_CACHE = CacheUtil.newTimedCache(5000);
 
  static {
    /** 每5ms檢查一次過(guò)期 */
    TIMED_CACHE.schedulePrune(5);
  }
 
  /**
   * 存入鍵值對(duì),提供消逝時(shí)間
   *
   * @param key
   * @param value
   * @param timeout
   */
  public static void put(String key, String value, Long timeout) {
    /** 設(shè)置消逝時(shí)間 */
    TIMED_CACHE.put(key, value, timeout);
  }
 
  /**
   * 每次重新get一次緩存,均會(huì)重新刷新消逝時(shí)間
   * @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次結(jié)果:" + get("haha"));
    ThreadUtil.sleep(2000);
    System.out.println("第2次結(jié)果:" + get("haha"));
    ThreadUtil.sleep(5000);
    System.out.println("第3次結(jié)果:" + get("haha"));
    // 取消定時(shí)清理
    TIMED_CACHE.cancelPruneSchedule();
  }
}

首先我們看一下執(zhí)行的效果

說(shuō)明:

1、設(shè)置的超時(shí)時(shí)間為3000毫秒,所以第一次打印在2秒鐘,所以可以獲取到值。

2、因?yàn)榈谝淮未蛴≌{(diào)用了get方法,刷新了過(guò)期時(shí)間,所以依然可以獲取到值。

3、第三次打印在5秒后,所以已經(jīng)過(guò)期,無(wú)法獲取到值,打印null。

那么,需要知道是否緩存還在可以使用containsKey方法。如下:

    put("haha", "1", 3000L);
    ThreadUtil.sleep(2000);
    if (TIMED_CACHE.containsKey("haha")) {
      System.out.println("第1次結(jié)果:緩存存在");
    }
//    System.out.println("第1次結(jié)果:" + get("haha"));
    ThreadUtil.sleep(2000);
    System.out.println("第2次結(jié)果:" + get("haha"));
    ThreadUtil.sleep(5000);
    System.out.println("第3次結(jié)果:" + get("haha"));
    // 取消定時(shí)清理
    TIMED_CACHE.cancelPruneSchedule();

執(zhí)行結(jié)果如下:

工具優(yōu)化-監(jiān)聽(tīng)過(guò)期、增加回調(diào)

我們?cè)谑褂肨imedCache會(huì)發(fā)現(xiàn),一旦緩存過(guò)期我們并不能立馬知道,很多工作場(chǎng)景中需要對(duì)緩存做監(jiān)聽(tīng)回調(diào)。所以我升級(jí)了一下該工具類。

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: 時(shí)間緩存工具 */
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);
  /** 回調(diào)方法映射 */
  private static ConcurrentHashMap<String, Consumer<String>> callbackMap;
 
  /**
   * 存入鍵值對(duì),添加過(guò)期時(shí)間,和消費(fèi)回調(diào)
   *
   * @param key
   * @param timeout
   * @param consumer
   */
  public static void put(String key, String value, Long timeout, Consumer<String> consumer) {
    TIMED_CACHE.put(key, value, timeout);
    addListen(key, consumer);
  }
 
  /**
   * 獲取緩存值
   *
   * @param key
   * @return
   */
  public static String get(String key) {
    return TIMED_CACHE.get(key);
  }
 
  /**
   * 刪除緩存和回調(diào)映射
   *
   * @param key
   */
  public static void remove(String key) {
    callbackMap.remove(key);
    TIMED_CACHE.remove(key);
  }
 
  /**
   * 添加監(jiān)聽(tīng)器
   *
   * @param key
   * @param consumer
   */
  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"));
    // 關(guān)閉監(jiān)聽(tīng)線程池
    listeningExecutorService.shutdown();
  }
}

執(zhí)行結(jié)果:

說(shuō)明:

1、可以看到監(jiān)聽(tīng)到緩存過(guò)期,并進(jìn)行了回調(diào)。

總結(jié)

具體的工具類使用場(chǎng)景,因項(xiàng)目而異,大家看著來(lái)。

如果本文對(duì)你有幫助,請(qǐng)點(diǎn)個(gè)贊支持一下吧。

到此這篇關(guān)于Java TimedCache 帶時(shí)間緩存工具類詳解使用的文章就介紹到這了,更多相關(guān)Java TimedCache內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中File文件操作類的基礎(chǔ)用法

    Java中File文件操作類的基礎(chǔ)用法

    這篇文章主要給大家介紹了關(guān)于Java中File文件操作類基礎(chǔ)用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用File類具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • JPA findById方法和getOne方法的區(qū)別說(shuō)明

    JPA findById方法和getOne方法的區(qū)別說(shuō)明

    這篇文章主要介紹了JPA findById方法和getOne方法的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2021-08-08
  • Java基礎(chǔ)篇之對(duì)象數(shù)組練習(xí)

    Java基礎(chǔ)篇之對(duì)象數(shù)組練習(xí)

    對(duì)象數(shù)組就是數(shù)組里的每個(gè)元素都是類的對(duì)象,賦值時(shí)先定義對(duì)象,然后將對(duì)象直接賦給數(shù)組就行了,這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)篇之對(duì)象數(shù)組練習(xí)的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • java中Future使用方法舉例詳細(xì)介紹

    java中Future使用方法舉例詳細(xì)介紹

    Future是java5新加的一個(gè)接口,提供了異步并行計(jì)算的功能,這篇文章主要介紹了java中Future使用方法紹的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • 淺析JVM如何處理Java中的精度轉(zhuǎn)換

    淺析JVM如何處理Java中的精度轉(zhuǎn)換

    在Java編程中,理解不同數(shù)據(jù)類型之間的轉(zhuǎn)換機(jī)制對(duì)于寫出高效、正確的代碼至關(guān)重要,本文將詳細(xì)探討Java中的精度轉(zhuǎn)換機(jī)制,有需要的小伙伴可以了解下
    2025-03-03
  • 基于springboot+jwt實(shí)現(xiàn)刷新token過(guò)程解析

    基于springboot+jwt實(shí)現(xiàn)刷新token過(guò)程解析

    這篇文章主要介紹了基于springboot+jwt實(shí)現(xiàn)刷新token過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Spring Boot全局異常處理解析

    Spring Boot全局異常處理解析

    這篇文章主要為大家詳細(xì)介紹了Spring Boot全局異常處理的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • java interface的兩個(gè)經(jīng)典用法

    java interface的兩個(gè)經(jīng)典用法

    這篇文章主要為大家詳細(xì)介紹了java interface的兩個(gè)經(jīng)典用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Spring-Retry的使用詳解

    Spring-Retry的使用詳解

    在日常的一些場(chǎng)景中, 很多需要進(jìn)行重試的操作.而spring-retry是spring提供的一個(gè)基于spring的重試框架,本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下
    2021-11-11
  • 啟動(dòng)SpringBoot報(bào)錯(cuò)Input length = 1問(wèn)題及解決

    啟動(dòng)SpringBoot報(bào)錯(cuò)Input length = 1問(wèn)題及解決

    這篇文章主要介紹了啟動(dòng)SpringBoot報(bào)錯(cuò)Input length = 1問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05

最新評(píng)論

青田县| 南部县| 澄江县| 潞西市| 高要市| 应城市| 滨州市| 固安县| 札达县| 溆浦县| 纳雍县| 罗江县| 鹤庆县| 河南省| 青田县| 梧州市| 博客| 隆安县| 东山县| 曲阳县| 芦溪县| 那坡县| 湘潭县| 师宗县| 吴江市| 绥滨县| 射洪县| 永安市| 新沂市| 邢台县| 拜城县| 隆林| 舟曲县| 河曲县| 中超| 嵩明县| 隆尧县| 喀喇沁旗| 如东县| 湄潭县| 祁东县|