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

Java分布式緩存VS本地緩存用法及說明

 更新時間:2026年04月01日 10:54:04   作者:大手你不懂  
本文介紹了本地緩存和分布式緩存的區(qū)別、適用場景及選擇方法,本地緩存如ConcurrentHashMap、GuavaCache等,適用于單機場景,追求極致性能;分布式緩存如Redis,適用于高并發(fā)、跨服務(wù)共享場景,結(jié)合使用兩者可發(fā)揮各自優(yōu)勢,提升系統(tǒng)性能

在Java開發(fā)中,緩存技術(shù)是提升系統(tǒng)性能的核心手段。無論是新手還是資深開發(fā)者,都會面臨一個關(guān)鍵問題:什么時候該用本地緩存?什么時候必須用分布式緩存?

本文將用通俗的語言和實際案例,帶你理解兩者的區(qū)別、適用場景以及如何選擇。

一、什么是緩存?為什么要用它?

緩存的本質(zhì):將頻繁訪問但獲取速度慢的數(shù)據(jù)(如數(shù)據(jù)庫查詢、遠(yuǎn)程API調(diào)用)存儲在訪問速度快的介質(zhì)中,減少對慢速數(shù)據(jù)源的依賴,從而提升系統(tǒng)性能。

常見的緩存類型

  • 本地緩存:數(shù)據(jù)存儲在應(yīng)用自己的內(nèi)存中,速度快但容量有限,受JVM的限制。
  • 分布式緩存:數(shù)據(jù)存儲在獨立的緩存服務(wù)中(如Redis),支持多服務(wù)共享,容量和性能可擴展。

二、本地緩存:速度王者,但“獨木難支”

本地緩存(Local Cache)是存儲在單個應(yīng)用實例內(nèi)存中的緩存,比如你的電腦里有一個“本地文件夾”,所有數(shù)據(jù)都直接存在這個文件夾里。

常見的Java本地緩存框架包括 Caffeine、Guava Cache、Ehcache 等。

1.本地緩存有哪些?各有什么優(yōu)劣?

(1)ConcurrentHashMap(Java標(biāo)準(zhǔn)庫)

優(yōu)點

  • 線程安全:通過鎖分段機制支持高并發(fā)訪問。
  • 簡單易用:無需額外依賴,直接使用。
  • 性能優(yōu)越:適用于高并發(fā)場景的簡單緩存。

缺點

  • 缺少高級功能:沒有過期策略、最大容量控制、緩存統(tǒng)計。
  • 沒有持久化:程序結(jié)束后數(shù)據(jù)丟失。

適用場景

  • 會話緩存、短期數(shù)據(jù)緩存(如登錄態(tài)臨時存儲)。

代碼示例

import java.util.concurrent.ConcurrentHashMap;

public class SimpleCache<K, V> {
    private final ConcurrentHashMap<K, V> cache = new ConcurrentHashMap<>();

    public V get(K key) {
        return cache.get(key);
    }

    public void put(K key, V value) {
        cache.put(key, value);
    }

    public void remove(K key) {
        cache.remove(key);
    }
}

(2)Guava Cache(Google開源庫)

優(yōu)點

  • 簡單易用:API設(shè)計簡潔,支持自動加載、過期策略(按時間或大?。?/li>
  • 靈活配置:支持LRU(最近最少使用)、LFU(最不經(jīng)常使用)等淘汰算法。
  • 高效:適用于中等規(guī)模緩存需求。

缺點

  • 功能有限:不支持持久化和分布式緩存。
  • 性能略低于Caffeine。

適用場景

  • 讀多寫少的場景(如靜態(tài)資源緩存)。

代碼示例

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.Cache;

public class GuavaCacheExample {
    public static void main(String[] args) {
        // 創(chuàng)建緩存:最大容量100,寫入后1分鐘過期
        Cache<String, String> cache = CacheBuilder.newBuilder()
            .maximumSize(100)
            .expireAfterWrite(1, TimeUnit.MINUTES)
            .build();

        cache.put("key1", "value1");
        String value = cache.getIfPresent("key1"); // 獲取緩存
        System.out.println("Value: " + value);
    }
}

(3)Caffeine(高性能本地緩存)

優(yōu)點

  • 性能頂尖:基于W-TinyLFU算法,命中率接近最優(yōu)值。
  • 支持異步清理:避免阻塞查詢請求。
  • 高度可配置:支持權(quán)重控制、異步刷新。

缺點

  • 不支持持久化:數(shù)據(jù)僅存在于內(nèi)存中。
  • 依賴JDK8及以上版本。

適用場景

  • 高頻讀取、低一致性要求的場景(如電商商品詳情緩存)。

代碼示例

import com.github.benmanes.caffeine.cache.Cache;        // Caffeine緩存接口
import com.github.benmanes.caffeine.cache.Caffeine;     // Caffeine緩存構(gòu)建器
import java.util.concurrent.TimeUnit;                  // 時間單位工具類

public class CaffeineDemo {

    // 初始化Caffeine緩存實例
    // 1. 最大緩存條目數(shù):1000條(超過后自動淘汰舊數(shù)據(jù))
    // 2. 數(shù)據(jù)寫入后10分鐘過期(自動失效策略)
    private static final Cache<String, Product> cache = Caffeine.newBuilder()
        .maximumSize(1000)
        .expireAfterWrite(10, TimeUnit.MINUTES)
        .build();

    /**
     * 獲取商品信息方法
     * @param productId 商品ID
     * @return Product 商品對象
     */
    public Product getProduct(String productId) {
        // Caffeine緩存核心API:get(key, mappingFunction)
        // 1. 如果緩存命中,直接返回緩存值
        // 2. 如果緩存未命中,執(zhí)行mappingFunction加載數(shù)據(jù)到緩存
        // 3. mappingFunction參數(shù)使用Lambda表達(dá)式簡化代碼
        return cache.get(productId, id -> fetchProductFromDB(id));
    }

    /**
     * 模擬從數(shù)據(jù)庫加載數(shù)據(jù)的方法
     * @param id 數(shù)據(jù)標(biāo)識符
     * @return 數(shù)據(jù)對象
     */
    private Product fetchProductFromDB(String id) {
        // 實際開發(fā)中這里會調(diào)用數(shù)據(jù)庫查詢接口
        // 當(dāng)前示例返回模擬數(shù)據(jù)
        return new Product(id, "Product-" + id);
    }
}

// Product類定義(示例)
class Product {
    private String id;
    private String name;

    public Product(String id, String name) {
        this.id = id;
        this.name = name;
    }

    // Getter方法省略
}

(4)Ehcache(多級緩存支持)

優(yōu)點

  • 堆內(nèi)+堆外+磁盤緩存:打破JVM內(nèi)存限制,適合大數(shù)據(jù)量場景。
  • 支持分布式集群:通過集群策略解決緩存漂移問題。
  • 兼容JCache標(biāo)準(zhǔn)(JSR-107)。

缺點

  • 配置復(fù)雜:需管理堆外內(nèi)存和磁盤存儲。
  • 性能略遜于Caffeine。

適用場景

  • 需要持久化的復(fù)雜場景(如日志緩存、監(jiān)控數(shù)據(jù))。

代碼示例

import org.ehcache.Cache;                               // Ehcache緩存接口
import org.ehcache.CacheManager;                        // 緩存管理器(管理多個緩存)
import org.ehcache.config.builders.CacheConfigurationBuilder;  // 緩存配置構(gòu)建器
import org.ehcache.config.builders.ResourcePoolsBuilder;       // 資源池配置構(gòu)建器
import org.ehcache.config.units.MemoryUnit;             // 內(nèi)存單位枚舉類(MB/GB)

public class EhcacheDemo {

    public static void main(String[] args) {
        // === 第一步:配置資源池 ===
        // ResourcePoolsBuilder用于定義緩存使用的存儲資源類型和大小
        ResourcePoolsBuilder resourcePools = ResourcePoolsBuilder.newResourcePoolsBuilder()
            .heap(20, MemoryUnit.MB)       // 堆內(nèi)緩存:20MB(速度最快,受JVM內(nèi)存限制)
            .offheap(10, MemoryUnit.MB)    // 堆外緩存:10MB(突破JVM內(nèi)存限制,速度次之)
            .disk(5, MemoryUnit.GB);       // 磁盤緩存:5GB(容量最大,速度最慢,適合冷數(shù)據(jù))

        // === 第二步:創(chuàng)建緩存管理器和緩存實例 ===
        // CacheManagerBuilder構(gòu)建緩存管理器,withCache()添加具體緩存配置
        // build(true) 表示立即構(gòu)建(實際生產(chǎn)環(huán)境建議延遲初始化)
        CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
            .withCache("myCache", CacheConfigurationBuilder.newCacheConfigurationBuilder(
                String.class, String.class, resourcePools))  // 定義緩存名稱和鍵值類型
            .build(true);

        // 從緩存管理器中獲取具體緩存實例
        // 泛型參數(shù)指定鍵值類型為<String, String>
        Cache<String, String> cache = cacheManager.getCache("myCache", String.class, String.class);

        // === 第三步:緩存操作 ===
        // 存入數(shù)據(jù):key1 -> value1
        cache.put("key1", "value1");

        // 獲取數(shù)據(jù):自動從堆內(nèi)->堆外->磁盤按優(yōu)先級查找
        System.out.println("Value: " + cache.get("key1"));  // 輸出:Value: value1
    }
}

資源池配置

heap(20, MB)

  • 作用:分配20MB堆內(nèi)內(nèi)存作為緩存存儲
  • 特點:速度最快,但受JVM內(nèi)存限制,適合熱點數(shù)據(jù)
  • 適用場景:高頻訪問的核心數(shù)據(jù)(如商品庫存)

offheap(10, MB)

  • 作用:分配10MB堆外內(nèi)存,突破JVM內(nèi)存限制
  • 特點:速度略慢于堆內(nèi),但比磁盤快100倍+
  • 適用場景:次熱點數(shù)據(jù)或需要避免OOM的場景

disk(5, GB)

  • 作用:分配5GB磁盤空間作為冷數(shù)據(jù)存儲
  • 特點:容量最大,但訪問速度最慢(毫秒級)
  • 適用場景:低頻訪問的冷數(shù)據(jù)(如歷史訂單)

性能對比

  • 堆內(nèi)緩存:納秒級(≈100ns)
  • 堆外緩存:微秒級(≈1μs)
  • 磁盤緩存:毫秒級(≈1ms)

3.本地緩存的核心優(yōu)勢

  • 極低延遲:訪問速度接近納秒級(比分布式緩存快100倍以上)。
  • 零網(wǎng)絡(luò)開銷:數(shù)據(jù)直接存放在應(yīng)用進程內(nèi)存中,無需跨網(wǎng)絡(luò)請求。
  • 資源占用少:不需要額外部署中間件(如Redis),運維成本低。

2.本地緩存的典型適用場景

  • 高頻讀取、低一致性要求:如靜態(tài)資源(頁面模板、配置文件)。
  • 數(shù)據(jù)量小且更新頻率低:如商品分類信息、菜單配置。
  • 單體應(yīng)用或微服務(wù)內(nèi)部緩存:當(dāng)數(shù)據(jù)只在單個服務(wù)實例內(nèi)使用時,如用戶登錄狀態(tài)的臨時緩存。

三、分布式緩存:高可用與共享的“全能選手”

分布式緩存(Distributed Cache)數(shù)據(jù)存儲在獨立的、外部的緩存服務(wù)集群中,應(yīng)用通過網(wǎng)絡(luò)訪問。

實現(xiàn)方案:

  • Redis(推薦),Memcached,KeyDB、Dragonfly。

優(yōu)缺點:

  • 優(yōu)點:緩存容量可水平擴展,不受單機限制;所有應(yīng)用實例共享同一份緩存數(shù)據(jù),保證了數(shù)據(jù)的一致性;服務(wù)獨立,不隨應(yīng)用重啟而丟失數(shù)據(jù)。
  • 缺點:存在網(wǎng)絡(luò)開銷,訪問速度低于本地緩存;需要維護獨立的緩存集群,增加了系統(tǒng)復(fù)雜度和運維成本。

1.典型適用場景

  • 高并發(fā)場景:高頻讀寫、數(shù)據(jù)量大。如秒殺活動、搶購場景(Redis處理10萬+/秒并發(fā)請求)。
  • 跨服務(wù)共享數(shù)據(jù):如用戶登錄態(tài)、購物車信息。
  • 需要持久化的數(shù)據(jù):多個服務(wù)實例需要協(xié)同工作,共享狀態(tài)。Redis支持RDB和AOF持久化,防止數(shù)據(jù)丟失。

2.實戰(zhàn)案例

假設(shè)開發(fā)一個社交平臺,需要緩存“最新評論”以減少數(shù)據(jù)庫壓力:

// 使用Redis緩存最新100條評論
String redisKey = "latest_comments";
jedis.lpush(redisKey, newComment); // 添加新評論到列表頭部
jedis.ltrim(redisKey, 0, 99);      // 保留最近100條評論

四、本地緩存 vs 分布式緩存:如何選擇?

維度本地緩存分布式緩存
數(shù)據(jù)一致性多實例間不一致,需額外處理天然保證一致性
訪問速度納秒級(最快)毫秒級(受網(wǎng)絡(luò)影響)
適用場景單體應(yīng)用、靜態(tài)數(shù)據(jù)、低頻更新高并發(fā)、跨服務(wù)共享、復(fù)雜業(yè)務(wù)
容量限制受JVM內(nèi)存限制可橫向擴展,支持TB級數(shù)據(jù)
運維復(fù)雜度低(無需額外部署)高(需獨立部署和維護)

五、實戰(zhàn)技巧:本地緩存 + 分布式緩存 = 性能翻倍

在實際項目中,本地緩存和分布式緩存可以結(jié)合使用,形成“雙層緩存架構(gòu)”:

分級緩存

  • 請求先查本地緩存(Caffeine)。
  • 未命中則查分布式緩存(Redis)。
  • 最后才查詢數(shù)據(jù)庫。

緩存預(yù)熱

  • 應(yīng)用啟動時,從數(shù)據(jù)庫加載熱點數(shù)據(jù)到本地緩存和Redis,減少首次訪問延遲。

數(shù)據(jù)同步

  • 當(dāng)Redis中的數(shù)據(jù)更新時,通過Redis的發(fā)布訂閱功能通知所有服務(wù)實例更新本地緩存。

六、總結(jié):選對工具,事半功倍

  • 本地緩存:適合單機場景,追求極致性能,但需容忍數(shù)據(jù)不一致。
  • 分布式緩存:適合分布式場景,保證數(shù)據(jù)共享和一致性,但需要權(quán)衡性能和成本。
  • 混合使用:通過“本地緩存 + 分布式緩存”架構(gòu),既能享受本地緩存的速度優(yōu)勢,又能利用分布式緩存的共享能力。

在實際開發(fā)中,根據(jù)業(yè)務(wù)需求選擇合適的工具。如果你還在糾結(jié)“Redis還是Caffeine”,不妨先問自己:我的數(shù)據(jù)需要被多少個服務(wù)共享?對延遲的要求有多高? 答案會指引你做出正確的選擇。

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

相關(guān)文章

  • Java中ArrayList和LinkedList區(qū)別

    Java中ArrayList和LinkedList區(qū)別

    這篇文章主要介紹了Java中ArrayList和LinkedList區(qū)別,下面我們就重點聊一聊在日常開發(fā)中經(jīng)常被使用到的兩個集合類ArrayList和LinkedList的本質(zhì)區(qū)別吧,需要的朋友可以參考一下
    2022-01-01
  • java 中斷線程的幾種方式 interrupt()詳解

    java 中斷線程的幾種方式 interrupt()詳解

    中斷(Interrupt)一個線程意味著在該線程完成任務(wù)之前停止其正在進行的一切,有效地中止其當(dāng)前的操作。這篇文章主要介紹了java 中斷線程的幾種方式 interrupt(),需要的朋友可以參考下
    2021-11-11
  • @Autowired注入為null問題原因分析

    @Autowired注入為null問題原因分析

    這篇文章主要介紹了@Autowired注入為null問題原因分析嗎,小編覺得挺不錯的,對日后比較有幫助,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • JAVA字符串反轉(zhuǎn)的三種方法

    JAVA字符串反轉(zhuǎn)的三種方法

    這篇文章主要介紹了JAVA字符串反轉(zhuǎn)的三種方法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • Spring?Initializr只能創(chuàng)建為Java?17版本以上的問題解決

    Spring?Initializr只能創(chuàng)建為Java?17版本以上的問題解決

    這篇文章主要給大家介紹了關(guān)于Spring?Initializr只能創(chuàng)建為Java?17版本以上問題的解決辦法,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • 老生常談spring的事務(wù)傳播機制

    老生常談spring的事務(wù)傳播機制

    這篇文章主要介紹了spring的事務(wù)傳播機制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java系統(tǒng)運行緩慢等問題的排查思路

    Java系統(tǒng)運行緩慢等問題的排查思路

    這篇文章主要介紹了Java系統(tǒng)運行緩慢等問題的排查思路,讀者可以根據(jù)具體情況具體分析,從而解決問題
    2021-04-04
  • Spring如何使用AOP實現(xiàn)聲明式事務(wù)管理

    Spring如何使用AOP實現(xiàn)聲明式事務(wù)管理

    Spring?使用?AOP?實現(xiàn)聲明式事務(wù)管理是其最強大的功能之一,這篇文章小編將詳細(xì)拆解這個過程,從高層概念到底層原理,感興趣的小伙伴可以參考一下
    2025-06-06
  • java Apache poi 對word doc文件進行讀寫操作

    java Apache poi 對word doc文件進行讀寫操作

    這篇文章主要介紹了Apache poi 對word doc文件進行讀寫操作的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • SpringBoot啟動時執(zhí)行自定義內(nèi)容的五種方法

    SpringBoot啟動時執(zhí)行自定義內(nèi)容的五種方法

    在Spring Boot應(yīng)用開發(fā)中,我們經(jīng)常需要在應(yīng)用啟動時執(zhí)行一些初始化邏輯,比如加載配置、初始化數(shù)據(jù)、啟動后臺任務(wù)等,Spring Boot提供了多種方式來實現(xiàn)這一需求,本文將詳細(xì)介紹5種常用的方法,需要的朋友可以參考下
    2025-10-10

最新評論

甘洛县| 泸定县| 兴海县| 中超| 沾益县| 南雄市| 文水县| 邵阳市| 廊坊市| 个旧市| 郎溪县| 治县。| 班戈县| 五峰| 墨脱县| 太仓市| 勐海县| 岑溪市| 柏乡县| 高要市| 红原县| 北票市| 静乐县| 土默特右旗| 廉江市| 民乐县| 行唐县| 安国市| 洛浦县| 云林县| 西峡县| 灵璧县| 和林格尔县| 房产| 高青县| 汝州市| 房产| 抚松县| 宜州市| 紫云| 九江县|