91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中TimedCache帶時間緩存工具類怎么用

發布時間:2022-03-03 14:05:05 來源:億速云 閱讀:241 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“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;
 
/** @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檢查一次過期 */
    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();
  }
}

首先我們看一下執行的效果

Java中TimedCache帶時間緩存工具類怎么用

說明:

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

執行結果如下:

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;
 
/** @Author huyi @Date 2021/10/12 10:57 @Description: 時間緩存工具 */
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;
 
  /**
   * 存入鍵值對,添加過期時間,和消費回調
   *
   * @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);
  }
 
  /**
   * 刪除緩存和回調映射
   *
   * @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<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帶時間緩存工具類怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

唐河县| 金川县| 日喀则市| 新民市| 黄石市| 新闻| 那曲县| 兴业县| 五大连池市| 富蕴县| 钦州市| 武乡县| 民乐县| 浦江县| 古蔺县| 沭阳县| 肥城市| 白玉县| 会东县| 肃南| 云浮市| 关岭| 辽中县| 双鸭山市| 新乡市| 平顶山市| 阳春市| 治县。| 金平| 册亨县| 呈贡县| 安宁市| 中牟县| 九台市| 开远市| 高要市| 通河县| 阿坝| 富锦市| 双牌县| 江华|