欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java內存緩存工具Guava LoadingCache使用解析

 更新時間:2020年01月16日 09:02:04   作者:森林木馬  
這篇文章主要介紹了Java內存緩存工具Guava LoadingCache使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了Java內存緩存工具Guava LoadingCache使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

一、Guava介紹

Guava是Google guava中的一個內存緩存模塊,用于將數據緩存到JVM內存中。實際項目開發(fā)中經常將一些公共或者常用的數據緩存起來方便快速訪問。

Guava Cache是單個應用運行時的本地緩存。它不把數據存放到文件或外部服務器。如果不符合需求,可以選擇Memcached、Redis等工具。

二、代碼示例

1. POM引入

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>28.1-jre</version>
</dependency>

2. 封裝工具類

package com.soyoung.ad.engine.util;
 
import com.google.common.cache.*;
import lombok.extern.slf4j.Slf4j;
 
import java.util.Map;
import java.util.concurrent.TimeUnit;
 
/**
 * 功能描述
 *
 * @author 馬振全 2020/1/13 16:18
 */
@Slf4j
public class CacheManager {
 
  /** 緩存項最大數量 */
  private static final long GUAVA_CACHE_SIZE = 100000;
 
  /** 緩存時間:天 */
  private static final long GUAVA_CACHE_DAY = 10;
 
  /** 緩存操作對象 */
  private static LoadingCache<Long, String> GLOBAL_CACHE = null;
 
  static {
    try {
      GLOBAL_CACHE = loadCache(new CacheLoader<Long, String>() {
        @Override
        public String load(Long key) throws Exception {
          // 處理緩存鍵不存在緩存值時的處理邏輯
          return "";
        }
      });
    } catch (Exception e) {
      log.error("初始化Guava Cache出錯", e);
    }
  }
 
  /**
   * 全局緩存設置
   *
   * 緩存項最大數量:100000
   * 緩存有效時間(天):10
   *
   *
   * @param cacheLoader
   * @return
   * @throws Exception
   */
  private static LoadingCache<Long, String> loadCache(CacheLoader<Long, String> cacheLoader) throws Exception {
    LoadingCache<Long, String> cache = CacheBuilder.newBuilder()
        //緩存池大小,在緩存項接近該大小時, Guava開始回收舊的緩存項
        .maximumSize(GUAVA_CACHE_SIZE)
        //設置時間對象沒有被讀/寫訪問則對象從內存中刪除(在另外的線程里面不定期維護)
        .expireAfterAccess(GUAVA_CACHE_DAY, TimeUnit.DAYS)
        // 設置緩存在寫入之后 設定時間 后失效
        .expireAfterWrite(GUAVA_CACHE_DAY, TimeUnit.DAYS)
        //移除監(jiān)聽器,緩存項被移除時會觸發(fā)
        .removalListener(new RemovalListener<Long, String>() {
          @Override
          public void onRemoval(RemovalNotification<Long, String> rn) {
            //邏輯操作
          }
        })
        //開啟Guava Cache的統(tǒng)計功能
        .recordStats()
        .build(cacheLoader);
    return cache;
  }
 
  /**
   * 設置緩存值
   * 注: 若已有該key值,則會先移除(會觸發(fā)removalListener移除監(jiān)聽器),再添加
   *
   * @param key
   * @param value
   */
  public static void put(Long key, String value) {
    try {
      GLOBAL_CACHE.put(key, value);
    } catch (Exception e) {
      log.error("設置緩存值出錯", e);
    }
  }
 
  /**
   * 批量設置緩存值
   *
   * @param map
   */
  public static void putAll(Map<? extends Long, ? extends String> map) {
    try {
      GLOBAL_CACHE.putAll(map);
    } catch (Exception e) {
      log.error("批量設置緩存值出錯", e);
    }
  }
 
  /**
   * 獲取緩存值
   * 注:如果鍵不存在值,將調用CacheLoader的load方法加載新值到該鍵中
   *
   * @param key
   * @return
   */
  public static String get(Long key) {
    String token = "";
    try {
      token = GLOBAL_CACHE.get(key);
    } catch (Exception e) {
      log.error("獲取緩存值出錯", e);
    }
    return token;
  }
 
  /**
   * 移除緩存
   *
   * @param key
   */
  public static void remove(Long key) {
    try {
      GLOBAL_CACHE.invalidate(key);
    } catch (Exception e) {
      log.error("移除緩存出錯", e);
    }
  }
 
  /**
   * 批量移除緩存
   *
   * @param keys
   */
  public static void removeAll(Iterable<Long> keys) {
    try {
      GLOBAL_CACHE.invalidateAll(keys);
    } catch (Exception e) {
      log.error("批量移除緩存出錯", e);
    }
  }
 
  /**
   * 清空所有緩存
   */
  public static void removeAll() {
    try {
      GLOBAL_CACHE.invalidateAll();
    } catch (Exception e) {
      log.error("清空所有緩存出錯", e);
    }
  }
 
  /**
   * 獲取緩存項數量
   *
   * @return
   */
  public static long size() {
    long size = 0;
    try {
      size = GLOBAL_CACHE.size();
    } catch (Exception e) {
      log.error("獲取緩存項數量出錯", e);
    }
    return size;
  }
}

三、使用總結

1. 移除機制

guava做cache時候數據的移除分為被動移除和主動移除兩種。

被動移除分為三種:

基于大小的移除:數量達到指定大小,會把不常用的鍵值移除

基于時間的移除:expireAfterAccess(long, TimeUnit) 根據某個鍵值對最后一次訪問之后多少時間后移除
        expireAfterWrite(long, TimeUnit) 根據某個鍵值對被創(chuàng)建或值被替換后多少時間移除

基于引用的移除:主要是基于java的垃圾回收機制,根據鍵或者值的引用關系決定移除

主動移除分為三種:1).單獨移除:Cache.invalidate(key)

         2).批量移除:Cache.invalidateAll(keys)

         3).移除所有:Cache.invalidateAll()

如果配置了移除監(jiān)聽器RemovalListener,則在所有移除的動作時會同步執(zhí)行該listener下的邏輯。

如需改成異步,使用:RemovalListeners.asynchronous(RemovalListener, Executor)

2. 遇到的問題

在put操作之前,如果已經有該鍵值,會先觸發(fā)removalListener移除監(jiān)聽器,再添加
配置了expireAfterAccess和expireAfterWrite,但在指定時間后沒有被移除。

解決方案:CacheBuilder構建的緩存不會在特定時間自動執(zhí)行清理和回收工作,也不會在某個緩存項過期后馬上清理,它不會啟動一個線程來進行緩存維護,因為a)線程相對較重,b)某些環(huán)境限制線程的創(chuàng)建。它會在寫操作時順帶做少量的維護工作,或者偶爾在讀操作時做。當然,也可以創(chuàng)建自己的維護線程,以固定的時間間隔調用Cache.cleanUp()。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java+opencv3.2.0實現重映射

    Java+opencv3.2.0實現重映射

    這篇文章主要為大家詳細介紹了Java+opencv3.2.0實現重映射的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • JAVA 時間區(qū)間的字符串合法性驗證

    JAVA 時間區(qū)間的字符串合法性驗證

    需要對獲得的諸如08:30-11:00這樣的字符串進行合法性驗證,判定表示的時間區(qū)間是否合法,以及對高峰期時間的區(qū)間是否在總的時間區(qū)間內部進行判斷。
    2013-03-03
  • 說說在Spring中如何引用外部屬性文件的方法

    說說在Spring中如何引用外部屬性文件的方法

    這篇文章主要介紹了說說在Spring中如何引用外部屬性文件的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • JAVA實現 springMVC方式的微信接入、實現消息自動回復實例

    JAVA實現 springMVC方式的微信接入、實現消息自動回復實例

    本篇文章主要介紹了JAVA實現 springMVC方式的微信接入、實現消息自動回復,這里整理了詳細的代碼,有需要的小伙伴可以參考下。
    2016-12-12
  • SpringSecurity如何配置跨域訪問

    SpringSecurity如何配置跨域訪問

    這篇文章主要介紹了SpringSecurity如何配置跨域訪問方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • mybatis主表與明細表一對多的同時插入操作方法

    mybatis主表與明細表一對多的同時插入操作方法

    對主表(采購申請表)和明細表(申請物資表)同時進行插入操作insert,怎么實現呢,下面給大家分享mybatis主表與明細表一對多的同時插入操作方法,感興趣的朋友一起看看吧
    2023-02-02
  • 使用MDC快速查詢應用接口全部執(zhí)行日志

    使用MDC快速查詢應用接口全部執(zhí)行日志

    這篇文章主要為大家介紹了使用MDC快速查詢應用接口全部執(zhí)行日志的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • idea 開發(fā)神器之idea插件匯總

    idea 開發(fā)神器之idea插件匯總

    這篇文章主要介紹了idea 開發(fā)神器之idea插件匯總,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • SpringBoot 錯誤處理機制與自定義錯誤處理實現詳解

    SpringBoot 錯誤處理機制與自定義錯誤處理實現詳解

    這篇文章主要介紹了SpringBoot 錯誤處理機制與自定義錯誤處理實現詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • SpringCloud超詳細講解Feign聲明式服務調用

    SpringCloud超詳細講解Feign聲明式服務調用

    Feign可以把Rest的請求進行隱藏,偽裝成類似Spring?MVC的Controller一樣。不用再自己拼接url,拼接參數等等操作,一切都交給Feign去做
    2022-06-06

最新評論