<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      淺談LocalCache | 京東云技術團隊

      1、什么是LocalCache?

      本地緩存是一種將數據存儲在應用程序內存中的機制,用于提高數據訪問的性能和響應速度。它通過在內存中維護一個鍵值對的存儲結構,允許應用程序快速檢索和訪問數據,而無需每次都從慢速的數據源(如數據庫或網絡)獲取數據。

      2、LocalCache優缺點

      1)優點

      ?快速訪問:LocalCache將數據存儲在內存中,因此可以快速訪問緩存數據,提高應用程序的性能。
      ?減輕后端負載:通過將經常訪問的數據存儲在本地緩存中,可以減少對后端數據源的訪問次數,降低后端負載,提高系統的整體性能。
      ?靈活性:LocalCache提供了一些配置選項,如最大容量、過期時間等,可以根據需求進行調整。這使得開發人員能夠靈活地控制緩存的行為,以適應不同的業務場景。

      2)缺點

      ?有限的容量:由于LocalCache是基于內存的,因此容量是有限的。如果緩存數據量過大,可能會導致內存消耗過高,影響系統的穩定性。
      ?單點故障:LocalCache存儲在單個應用程序中,如果應用程序崩潰或重啟,緩存數據將丟失。這可能會導致緩存冷啟動和性能下降。

      3、LocalCache應用場景

      LocalCache適用于許多不同的使用場景,特別是以下幾種情況:

      1.頻繁訪問的數據:如果應用程序中有一些頻繁被訪問的數據,將這些數據存儲在LocalCache中可以大大提高訪問速度。由于數據存儲在內存中,相比于從磁盤或網絡中讀取數據,從本地緩存中獲取數據的速度更快。
      2.減輕后端負載:通過將經常訪問的數據存儲在本地緩存中,可以減少對后端數據源(如數據庫或API)的訪問次數。這樣可以降低后端的負載,提高系統的整體性能。
      3.降低網絡延遲:在分布式系統或微服務架構中,不同的服務可能位于不同的節點上,通過網絡進行通信。使用本地緩存可以減少對遠程服務的調用次數,從而減少網絡延遲,提高系統的響應速度。
      4.靈活性和可配置性:LocalCache提供了一些配置選項,如最大容量、過期時間等,可以根據需求進行調整。這使得開發人員能夠靈活地控制緩存的行為,以適應不同的業務場景。

      4、LocalCache實際使用場景

      1.數據庫中間件:數據庫中間件是位于應用程序和后端數據庫之間的軟件層,常見的數據庫中間件包括MySQL Proxy、Cobar、MyCat等。這些中間件可以使用LocalCache來緩存查詢結果,以減輕后端數據庫的負載并提高查詢性能。當應用程序發出相同的查詢請求時,中間件可以先檢查LocalCache中是否有相應的緩存結果,如果有則直接返回緩存結果,否則再向后端數據庫發起查詢請求。
      2.消息隊列:消息隊列是一種用于異步通信的中間件,常見的消息隊列系統包括Apache Kafka、RabbitMQ等。在消息隊列系統中,LocalCache可以用來緩存消息,以提高消息的處理速度和響應能力。當消費者需要處理消息時,它可以先在LocalCache中查找是否有相應的消息緩存,如果有則直接消費緩存消息,否則再從消息隊列中獲取消息。
      3.前端應用:前端應用包括各種Web應用、移動應用和桌面應用,常見的前端框架如React、Angular、Vue.js等。在前端應用中,LocalCache可以用于緩存靜態資源(如JavaScript、CSS、圖像等)或動態數據,以提高應用的加載速度和用戶體驗。例如,前端應用可以先檢查LocalCache中是否有相應的資源緩存,如果有則直接使用緩存資源,否則再從服務器獲取資源并將其緩存到LocalCache中。
      4.服務端應用:服務端應用包括各種后端服務、微服務和RESTful API等,常見的服務端框架如Spring、Node.js、Ruby on Rails等。LocalCache可以在服務端應用中使用,用于緩存計算結果、數據庫查詢結果等,以提高性能和減少對外部資源的依賴。例如,當服務端應用需要進行頻繁的計算或查詢時,它可以先檢查LocalCache中是否有相應的緩存結果,如果有則直接返回緩存結果,否則再進行計算或查詢,并將結果緩存到LocalCache中。
      5.開源框架:許多開源框架提供了自己的LocalCache實現,以方便開發人員在應用中使用。這些框架通常提供了豐富的配置選項和高性能的緩存實現,可以根據應用需求進行定制。例如,Guava、Caffeine和Ehcache等是常見的Java開源框架,它們提供了LocalCache的實現,可以用于緩存計算結果、數據庫查詢結果等。

      5、LocalCache在Guava實踐

      Guava cache 繼承了 ConcurrentHashMap 的思路,使用多個 segments 方式的細粒度鎖,在保證線程安全的同時,支持高并發場景需求。

      1、CacheBuilder 緩存構建器。構建緩存的入口,指定緩存配置參數并初始化本地緩存。采用 Builder 設計模式提供了設置好各種參數的緩存對象。

      CacheBuilder<Object,Object> cacheBuilder =CacheBuilder.newBuilder();
      
      

      2、LocalCache 數據結構。緩存核心類 LocalCache 數據結構與 ConcurrentHashMap 很相似,由多個 segment 組成,且各 segment 相對獨立,互不影響,所以能支持并行操作,每個 segment 由一個 table 和若干隊列組成。緩存數據存儲在 table 中,其類型為AtomicReferenceArray,具體結構圖及代碼解釋如下。

       

       

       

      #Guava中LocalCache聲明segments變量
      final LocalCache.Segment<K, V>[] segments;
      
      #Guava中初始化segments
      this.segments = this.newSegmentArray(segmentCount);
      final LocalCache.Segment<K, V>[] newSegmentArray(int ssize) {
          return new LocalCache.Segment[ssize];
      }
      #獲取Segment
      Segment<K, V> segmentFor(int hash) {
          return segments[(hash >>> segmentShift) & segmentMask];
      }
      
      #Guava中Segment聲明table變量用于存儲數據
      volatile AtomicReferenceArray<LocalCache.ReferenceEntry<K, V>> table;
      
      V put(K key, int hash, V value, boolean onlyIfAbsent) {
          #保證線程安全
          lock(); 
          #獲取數據
          AtomicReferenceArray<ReferenceEntry<K, V>> table = this.table;
          int index = hash & (table.length() - 1);
          ReferenceEntry<K, V> first = table.get(index);
          for (ReferenceEntry<K, V> e = first; e != null; e = e.getNext()) {
            if (e.getHash() == hash
            && entryKey != null
            && map.keyEquivalence.equivalent(key, entryKey)) {
            }
          }
      }
      
      

      3、在Guava中,CacheBuilder提供了一系列方法,用于指定緩存的大小、過期策略、并發級別等屬性。

      1.配置緩存屬性:通過一系列方法來配置緩存的屬性,例如:
      ?maximumSize(long size):指定緩存的最大容量,當緩存達到最大容量時,根據緩存策略淘汰部分緩存項。
      ?expireAfterWrite(Duration duration):指定緩存項的寫入后過期時間,過期后的緩存項將被自動移除。
      ?expireAfterAccess(Duration duration):指定緩存項的最后一次訪問后過期時間,過期后的緩存項將被自動移除。
      ?concurrencyLevel(int level):指定并發級別,即同時可以進行緩存操作的線程數。
      Cache<Object,Object> cache = cacheBuilder.maximumSize(1000)
                                              .expireAfterWrite(Duration.ofMinutes(10))
                                              .concurrencyLevel(4)
                                              .build();
      
      

      2. 使用緩存:通過Cache對象的方法來進行緩存的讀取、寫入和移除操作。例如:

      ?get(Object key):根據鍵獲取緩存項的值。

       

       

       

      ?put(Object key, Object value):向緩存中添加或更新一個緩存項。

       

       

       

      ?invalidate(Object key):移除指定鍵的緩存項。

       

       

       

      3. 其他功能:Guava的LocalCache還提供了其他功能,如統計信息、監聽器、加載器等,用于監控緩存的狀態、處理緩存未命中的情況等。

      CacheStats stats = cache.stats();
      cache.asMap().forEach((key, value)->System.out.println(key +": "+ value));
      cache.cleanUp();
      
      

      總結來說,Guava的LocalCache使用CacheBuilder構建和配置緩存,通過Cache對象進行緩存的讀取、寫入和移除操作。開發人員可以根據自己的需求使用相應的方法和功能來定制和管理緩存。

      6、后記

      設計一個可用的 Cache 絕對不是一個普通的 Map 這么簡單,這里小結一下關于 Guava Cache 的知識。

      回歸LocalCache 的源頭,我是希望可以了解 設計一個緩存要考慮什么?局部性原理 是一個系統性能提升的最直接的方式(編程上,硬件上當然也可以),緩存的出現就是根據 局部性原理 所設計的。

       

       

       

      緩存作為存儲金字塔的一部分,一定需要考慮以下幾個問題:

      1.何時加載

      在設計何時加載的問題上,Guava Cache 提供了一個 Loader 接口,讓用戶可以自定義加載過程,在由 Cache 在找不到對象的時候主動調用 Loader 去加載,還通過一個巧妙的方法,既保證了 Loader 的只運行一次,還能保證鎖粒度極小,保證并發加載時,安全且高性能。

      2. 何時失效

      失效處理上,Guava Cache 提供了基于容量、有限時間(讀有限時、寫有限時)等失效策略,在官方文檔上也寫明,在基于限時的情況下,并不是使用一個線程去單獨清理過期 K-V,而是把這個清理工作,均攤到每次訪問中。假如需要定時清理,也可以調用 CleanUp 方法,定時調用就可以了。

      3. 如何保持熱點數據有效性

      在 Cache 容量有限時, LRU 算法是一個通用的解決方案,在源碼中,Guava Cache 并不是嚴格地保證全局 LRU 的,只是針對一個 Segment 實現 LRU 算法。這個前提是 Segment 對用戶來說是隨機的,所以全局的 LRU 算法和單個 Segment 的算法是基本一致的。

      4. 寫回策略

      在 Guava Cache 里,并沒有實現任何的寫回策略。原因在于,Guava Cache 是一個本地緩存,直接修改對象的數據,Cache 的數據就已經是最新的了,所以在數據能夠寫入 DB 后,數據就已經完成一致了。

      參考文獻:Google Guava Cache 全解析

      作者:京東科技 游斌平

      來源:京東云開發者社區 轉載請注明來源

      posted @ 2024-02-05 14:23  京東云技術團隊  閱讀(292)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 免费无码影视在线观看mov| 久久亚洲精品11p| 日韩有码av中文字幕| 变态另类视频一区二区三区| 亚洲中文字幕一二三四区| 亚洲AV无码久久精品成人| 河北区| 美腿丝袜亚洲综合第一页| 在线观看精品日本一区二| 好吊视频一区二区三区人妖| 自拍视频在线观看成人| 国产精品熟女一区二区三区 | 日日噜噜夜夜狠狠视频| 国产成人av综合色| 成人区人妻精品一区二蜜臀| 午夜精品福利亚洲国产| 国精品91人妻无码一区二区三区| 国产99视频精品免费视频36| 免费无码va一区二区三区| 成人免费视频在线观看播放| 四川少妇被弄到高潮| 精品少妇爆乳无码aⅴ区| 人妻另类 专区 欧美 制服| 强奷漂亮少妇高潮伦理| 最新国产AV最新国产在钱| 国产深夜福利视频在线| 第一精品福利导福航| 宁城县| 日本国产精品第一页久久| 欧美极品色午夜在线视频| 性动态图无遮挡试看30秒| 在线播放国产精品三级网| 中文字幕一卡二卡三卡| 少妇人妻精品无码专区视频| 九九视频热最新在线视频| 狠狠婷婷综合久久久久久| 国产精品一区二区三区黄| 26uuu另类亚洲欧美日本| 黑人大战中国av女叫惨了| 日韩高清福利视频在线观看| 国产不卡免费一区二区|