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

關于Guava緩存詳解及使用說明

 更新時間:2022年10月27日 10:17:19   作者:阿拉的夢想  
這篇文章主要介紹了關于Guava緩存詳解及使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

緩存

緩存分為本地緩存與分布式緩存。

本地緩存為了保證線程安全問題,一般使用ConcurrentMap的方式保存在內(nèi)存之中,而常見的分布式緩存則有Redis,MongoDB等。

  • 一致性:本地緩存由于數(shù)據(jù)存儲于內(nèi)存之中,每個實例都有自己的副本,可能會存在不一致的情況;分布式緩存則可有效避免這種情況
  • 開銷:本地緩存會占用JVM內(nèi)存,會影響GC及系統(tǒng)性能;分布式緩存的開銷則在于網(wǎng)絡時延和對象序列化,故主要影響調(diào)用時延
  • 適用場景:本地緩存適用于數(shù)據(jù)量較小或變動較少的數(shù)據(jù);分布式緩存則適用于一致性要求較高及數(shù)量量大的場景(可彈性擴容)

本地緩存適用于數(shù)據(jù)量較小或變動較少的數(shù)據(jù),因為變動多需要考慮到不同實例的緩存一致性問題,而數(shù)據(jù)量大則需要考慮緩存回收策略及GC相關的問題

Guava cache

Guava Cache 是Google Fuava中的一個內(nèi)存緩存模塊,用于將數(shù)據(jù)緩存到JVM內(nèi)存中。

  • 提供了get、put封裝操作,能夠集成數(shù)據(jù)源 ;
  • 線程安全的緩存,與ConcurrentMap相似,但前者增加了更多的元素失效策略,后者只能顯示的移除元素;
  • Guava Cache提供了多種基本的緩存回收方式
  • 監(jiān)控緩存加載/命中情況

通常,Guava緩存適用于以下情況:

  • 愿意花費一些內(nèi)存來提高速度。
  • 使用場景有時會多次查詢key。
  • 緩存將不需要存儲超出RAM容量的數(shù)據(jù)

詳細配置

緩存的并發(fā)級別

Guava提供了設置并發(fā)級別的API,使得緩存支持并發(fā)的寫入和讀取。

與ConcurrentHashMap類似,Guava cache的并發(fā)也是通過分離鎖實現(xiàn)。

在通常情況下,推薦將并發(fā)級別設置為服務器cpu核心數(shù)。

CacheBuilder.newBuilder()
		// 設置并發(fā)級別為cpu核心數(shù),默認為4
		.concurrencyLevel(Runtime.getRuntime().availableProcessors()) 
		.build();

緩存的初始容量設置

我們在構建緩存時可以為緩存設置一個合理大小初始容量,由于Guava的緩存使用了分離鎖的機制,擴容的代價非常昂貴。

所以合理的初始容量能夠減少緩存容器的擴容次數(shù)。

CacheBuilder.newBuilder()
		// 設置初始容量為100
		.initialCapacity(100)
		.build();

設置最大存儲

Guava Cache可以在構建緩存對象時指定緩存所能夠存儲的最大記錄數(shù)量。

當Cache中的記錄數(shù)量達到最大值后再調(diào)用put方法向其中添加對象,Guava會先從當前緩存的對象記錄中選擇一條刪除掉,騰出空間后再將新的對象存儲到Cache中。

CacheBuilder.newBuilder()
		// 設置最大容量為1000
		.maximumSize(1000)
		.build();

緩存清除策略

基于存活時間的清除策略

  • expireAfterWrite 寫緩存后多久過期
  • expireAfterAccess 讀寫緩存后多久過期

存活時間策略可以單獨設置或組合配置

基于容量的清除策略

通過CacheBuilder.maximumSize(long)方法可以設置Cache的最大容量數(shù),當緩存數(shù)量達到或接近該最大值時,Cache將清除掉那些最近最少使用的緩存

基于權重的清除策略

使用CacheBuilder.weigher(Weigher)指定一個權重函數(shù),并且用CacheBuilder.maximumWeight(long)指定最大總重。

如每一項緩存所占據(jù)的內(nèi)存空間大小都不一樣,可以看作它們有不同的“權重”(weights),作為執(zhí)行清除策略時優(yōu)化回收的對象

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
       .maximumWeight(100000)
       .weigher(new Weigher<Key, Graph>() {
          public int weigh(Key k, Graph g) {
            return g.vertices().size();
          }
        })
       .build(
           new CacheLoader<Key, Graph>() {
             public Graph load(Key key) { // no checked exception
               return createExpensiveGraph(key);
             }
           });

顯式清除

  • 清除單個key:Cache.invalidate(key)
  • 批量清除key:Cache.invalidateAll(keys)
  • 清除所有緩存項:Cache.invalidateAll()

基于引用的清除策略

在構建Cache實例過程中,通過設置使用弱引用的鍵、或弱引用的值、或軟引用的值,從而使JVM在GC時順帶實現(xiàn)緩存的清除

  • CacheBuilder.weakKeys():使用弱引用存儲鍵。當鍵沒有其它(強或軟)引用時,緩存項可以被垃圾回收
  • CacheBuilder.weakValues():使用弱引用存儲值。當值沒有其它(強或軟)引用時,緩存項可以被垃圾回收
  • CacheBuilder.softValues():使用軟引用存儲值。軟引用只有在響應內(nèi)存需要時,才按照全局最近最少使用的順序回收。考慮到使用軟引用的性能影響,我們通常建議使用更有性能預測性的緩存大小限定

垃圾回收僅依賴==恒等式,使用弱引用鍵的緩存用而不是equals(),即同一對象引用。

Cache 

顯式put操作置入內(nèi)存

private static Cache<Integer, Integer> numCache = CacheBuilder.newBuilder()
        .expireAfterWrite(5, TimeUnit.MINUTES)
        .build();

public static void main(String[] args) throws Exception {
    System.out.println(numCache.getIfPresent(1));
    Thread.sleep(1000);
    System.out.println(numCache.getIfPresent(1));
    Thread.sleep(1000);
    numCache.put(1, 5);
    System.out.println(numCache.getIfPresent(1));
    // console: null null 5
}

LoadingCache

使用自定義ClassLoader加載數(shù)據(jù),置入內(nèi)存中。從LoadingCache中獲取數(shù)據(jù)時,若數(shù)據(jù)存在則直接返回;若數(shù)據(jù)不存在,則根據(jù)ClassLoader的load方法加載數(shù)據(jù)至內(nèi)存,然后返回該數(shù)據(jù)

private static LoadingCache<Integer,Integer> numCache = CacheBuilder.newBuilder().
        expireAfterWrite(5L, TimeUnit.MINUTES).
        maximumSize(5000L).
        build(new CacheLoader<Integer, Integer>() {
            @Override
            public Integer load(Integer key) throws Exception {
                System.out.println("no cache");
                return key * 5;
            }
        });

public static void main(String[] args) throws Exception {
    System.out.println(numCache.get(1));
    Thread.sleep(1000);
    System.out.println(numCache.get(1));
    Thread.sleep(1000);
    numCache.put(1, 6);
    System.out.println(numCache.get(1));
    // console: 5 5 6
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • SpringBoot重寫addResourceHandlers映射文件路徑方式

    SpringBoot重寫addResourceHandlers映射文件路徑方式

    這篇文章主要介紹了SpringBoot重寫addResourceHandlers映射文件路徑方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java中Object.wait()和LockSupport.park()的用法

    Java中Object.wait()和LockSupport.park()的用法

    Object.wait()和LockSupport.park()都是用來使當前線程等待的方法,本文主要介紹了Java中Object.wait()和LockSupport.park()的用法,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • 使用SkyWalking監(jiān)控Java服務的過程

    使用SkyWalking監(jiān)控Java服務的過程

    這篇文章主要介紹了使用SkyWalking監(jiān)控Java服務,介紹一個對源碼0入侵的Java服務監(jiān)控方式,SkyWalking Agent,只需要啟動Java程序的時候加幾個參數(shù),就能對Java服務進行可視化監(jiān)控,需要的朋友可以參考下
    2023-08-08
  • 詳解Spring Retry實現(xiàn)原理

    詳解Spring Retry實現(xiàn)原理

    這篇文章主要介紹了詳解Spring Retry實現(xiàn)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 淺談UUID生成的原理及優(yōu)缺點

    淺談UUID生成的原理及優(yōu)缺點

    UUID是一套用于生成全局唯一標識符的標準,也被稱為GUID?(Globally?Unique?Identifier),通過使用UUID可以在分布式系統(tǒng)中生成唯一的?ID,UUID的生成方式有多種,本文將詳細講解?UUID?的生成原理、特性、實用場景以及優(yōu)缺點
    2023-06-06
  • ReentrantLock獲取鎖釋放鎖的流程示例分析

    ReentrantLock獲取鎖釋放鎖的流程示例分析

    這篇文章主要為大家介紹了ReentrantLock獲取鎖釋放鎖的流程示例分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Spring?Boot?3.3?實現(xiàn)職責鏈模式輕松應對電商訂單流程分析

    Spring?Boot?3.3?實現(xiàn)職責鏈模式輕松應對電商訂單流程分析

    在電商系統(tǒng)中,訂單處理流程包括庫存校驗、優(yōu)惠券驗證、運費計算等多個步驟,這些步驟具有順序依賴性,為了管理這些業(yè)務邏輯,職責鏈模式提供了解決方案,通過鏈式關系將處理邏輯模塊化,實現(xiàn)解耦和靈活擴展,本文將探討如何結(jié)合SpringBoot實現(xiàn)職責鏈模式,優(yōu)化電商訂單處理流程
    2024-10-10
  • 淺析JVM的垃圾回收器

    淺析JVM的垃圾回收器

    這篇文章主要介紹了JVM垃圾回收器的相關資料,幫助大家更好的理解和學習Java虛擬機的相關知識,感興趣的朋友可以了解下
    2020-11-11
  • 淺析java中常用的定時任務框架-單體

    淺析java中常用的定時任務框架-單體

    這篇文章主要帶大家了解常用的單體應用定時任務框架以及掌握定時任務在單體中如何使用,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2021-12-12
  • java?面向?qū)ο蟠a塊及不同位置對屬性賦值的執(zhí)行順序

    java?面向?qū)ο蟠a塊及不同位置對屬性賦值的執(zhí)行順序

    這篇文章主要介紹了java面向?qū)ο蟠a塊及不同位置對屬性賦值的執(zhí)行順序,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09

最新評論

堆龙德庆县| 灌云县| 洞口县| 乐业县| 巫溪县| 古田县| 四子王旗| 富锦市| 邳州市| 体育| 鹿泉市| 仪征市| 长顺县| 南岸区| 新野县| 宁海县| 视频| 明光市| 南川市| 调兵山市| 仲巴县| 河北省| 西盟| 隆化县| 临海市| 卢龙县| 无极县| 元朗区| 葫芦岛市| 怀仁县| 邻水| 贵定县| 汝阳县| 舒城县| 眉山市| 柳江县| 上栗县| 江永县| 山西省| 浙江省| 广州市|