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

Redis+Caffeine如何構(gòu)建高性能二級(jí)緩存

 更新時(shí)間:2025年05月12日 14:37:17   作者:摘星編程  
這篇文章主要介紹了Redis+Caffeine如何構(gòu)建高性能二級(jí)緩存問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

二級(jí)緩存架構(gòu)的技術(shù)背景

1. 基礎(chǔ)緩存架構(gòu)

在現(xiàn)代分布式系統(tǒng)設(shè)計(jì)中,緩存是優(yōu)化服務(wù)性能的核心組件。標(biāo)準(zhǔn)實(shí)現(xiàn)方案采用遠(yuǎn)程緩存(如Redis/Memcached)作為數(shù)據(jù)庫(kù)前置層,通過(guò)以下機(jī)制提升性能:

  • 讀寫(xiě)策略:遵循Cache-Aside模式,僅當(dāng)緩存未命中時(shí)查詢(xún)數(shù)據(jù)庫(kù)
  • 核心價(jià)值:
  • 將平均響應(yīng)時(shí)間從數(shù)據(jù)庫(kù)的10-100ms級(jí)別降至1-10ms
  • 降低數(shù)據(jù)庫(kù)負(fù)載50%-80%(根據(jù)命中率變化)

2. 架構(gòu)演進(jìn)動(dòng)因

當(dāng)系統(tǒng)面臨以下場(chǎng)景時(shí),純遠(yuǎn)程緩存方案顯現(xiàn)局限性:

問(wèn)題類(lèi)型

表現(xiàn)特征

典型案例

超高并發(fā)讀取

Redis帶寬成為瓶頸

熱點(diǎn)商品詳情頁(yè)訪(fǎng)問(wèn)

超低延遲要求

網(wǎng)絡(luò)往返耗時(shí)不可忽略

金融行情數(shù)據(jù)推送

成本控制需求

高頻訪(fǎng)問(wèn)導(dǎo)致Redis擴(kuò)容

用戶(hù)基礎(chǔ)信息查詢(xún)

3. 二級(jí)緩存解決方案

引入本地緩存構(gòu)建兩級(jí)緩存體系:

  • 一級(jí)緩存:Caffeine(高性能本地緩存)
  • 二級(jí)緩存:Redis Cluster(高可用遠(yuǎn)程緩存)

協(xié)同機(jī)制:

  • 本地緩存設(shè)置短TTL(秒級(jí))
  • 遠(yuǎn)程緩存設(shè)置長(zhǎng)TTL(分鐘級(jí))
  • 通過(guò)PubSub實(shí)現(xiàn)跨節(jié)點(diǎn)失效

為什么選擇本地緩存?

1. 極速訪(fǎng)問(wèn)

內(nèi)存級(jí)響應(yīng):本地緩存直接存儲(chǔ)在應(yīng)用進(jìn)程的內(nèi)存中(如Java堆內(nèi)),訪(fǎng)問(wèn)速度通常在納秒級(jí)(如Caffeine的讀寫(xiě)性能可達(dá)每秒千萬(wàn)次),而遠(yuǎn)程緩存(如Redis)需要網(wǎng)絡(luò)通信,延遲在毫秒級(jí)。

技術(shù)選型

響應(yīng)時(shí)長(zhǎng)

本地緩存

~100ns

Redis遠(yuǎn)程緩存

~1ms(受網(wǎng)絡(luò)影響可能更高)

數(shù)據(jù)庫(kù)查詢(xún)

~10ms 甚至更長(zhǎng)。

2. 減少網(wǎng)絡(luò)IO

  • 避免遠(yuǎn)程調(diào)用:每次訪(fǎng)問(wèn)Redis都需要經(jīng)過(guò)網(wǎng)絡(luò)I/O(序列化、傳輸、反序列化),本地緩存完全繞過(guò)這一過(guò)程。
  • 適用場(chǎng)景:高頻訪(fǎng)問(wèn)的熱點(diǎn)數(shù)據(jù)(如商品詳情、用戶(hù)基礎(chǔ)信息),通過(guò)本地緩存可減少90%以上的Redis請(qǐng)求。

3. 降低遠(yuǎn)程緩存和數(shù)據(jù)庫(kù)壓力

  • 保護(hù)Redis:大量請(qǐng)求直接命中本地緩存,避免Redis成為瓶頸(尤其在高并發(fā)場(chǎng)景下,如秒殺、熱點(diǎn)查詢(xún))。
  • 減少穿透風(fēng)險(xiǎn):本地緩存可設(shè)置短期過(guò)期時(shí)間,避免緩存失效時(shí)大量請(qǐng)求直接沖擊數(shù)據(jù)庫(kù)。

4. 提升系統(tǒng)吞吐量

  • 減少線(xiàn)程阻塞:遠(yuǎn)程緩存訪(fǎng)問(wèn)會(huì)阻塞線(xiàn)程(如Redis的同步調(diào)用),本地緩存無(wú)此問(wèn)題,尤其適合高并發(fā)服務(wù)。
  • 案例:某電商系統(tǒng)引入Caffeine后,QPS從1萬(wàn)提升到5萬(wàn),Redis負(fù)載下降60%。

5. 功能靈活

本地緩存支持豐富的特性,滿(mǎn)足不同業(yè)務(wù)需求:

  • 淘汰策略:LRU(最近最少使用)、LFU(最不經(jīng)常使用)、FIFO等。
  • 過(guò)期控制:支持基于時(shí)間(寫(xiě)入后過(guò)期、訪(fǎng)問(wèn)后過(guò)期)或容量觸發(fā)淘汰。
  • 原子操作:如get-if-absent-compute(查不到時(shí)自動(dòng)加載),避免并發(fā)重復(fù)查詢(xún)。

本地內(nèi)存具備的功能

1. 基本讀寫(xiě)

功能:基礎(chǔ)的鍵值存儲(chǔ)與原子操作。

Cache<String, String> cache = Caffeine.newBuilder().build();

// 寫(xiě)入緩存
cache.put("user:1", "Alice");

// 讀取緩存(若不存在則自動(dòng)計(jì)算)
String value = cache.get("user:1", key -> fetchFromDB(key));

2. 緩存淘汰策略

功能:限制緩存大小并淘汰數(shù)據(jù)。

算法

描述

適用場(chǎng)景

代碼示例(Caffeine)

LRU

淘汰最久未訪(fǎng)問(wèn)的數(shù)據(jù)

熱點(diǎn)數(shù)據(jù)分布不均勻

.maximumSize(100).build()

LFU

淘汰訪(fǎng)問(wèn)頻率最低的數(shù)據(jù)

長(zhǎng)期穩(wěn)定的熱點(diǎn)數(shù)據(jù)

.maximumSize(100).build()

(W-TinyLFU)

FIFO

按寫(xiě)入順序淘汰

數(shù)據(jù)順序敏感的場(chǎng)景

需自定義實(shí)現(xiàn)

3. 過(guò)期時(shí)間控制

功能:自動(dòng)清理過(guò)期數(shù)據(jù)。

Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES) // 寫(xiě)入后10分鐘過(guò)期
.expireAfterAccess(5, TimeUnit.MINUTES) // 訪(fǎng)問(wèn)后5分鐘過(guò)期
.build();

4. 緩存加載與刷新

功能:自動(dòng)加載數(shù)據(jù)并支持后臺(tái)刷新。

AsyncLoadingCache<String, String> cache = Caffeine.newBuilder()
.refreshAfterWrite(1, TimeUnit.MINUTES) // 1分鐘后后臺(tái)刷新
.buildAsync(key -> fetchFromDB(key));

// 獲取數(shù)據(jù)(若需刷新,不會(huì)阻塞請(qǐng)求)
CompletableFuture<String> future = cache.get("user:1");

5. 并發(fā)控制

功能:線(xiàn)程安全與擊穿保護(hù)。

// 自動(dòng)合并并發(fā)請(qǐng)求(同一key僅一次加載)
LoadingCache<String, String> cache = Caffeine.newBuilder()
    .build(key -> {
        System.out.println("僅執(zhí)行一次: " + key);
        return fetchFromDB(key);
    });

// 并發(fā)測(cè)試(輸出1次日志)
IntStream.range(0, 100).parallel().forEach(
    i -> cache.get("user:1")
);

6. 統(tǒng)計(jì)與監(jiān)控

功能:記錄命中率等指標(biāo)。

Cache<String, String> cache = Caffeine.newBuilder()
.recordStats() // 開(kāi)啟統(tǒng)計(jì)
.build();

cache.get("user:1");
CacheStats stats = cache.stats();
System.out.println("命中率: " + stats.hitRate());

7. 持久化

功能:緩存數(shù)據(jù)持久化到磁盤(pán)。

// 使用Caffeine + RocksDB(需額外依賴(lài))
Cache<String, byte[]> cache = Caffeine.newBuilder()
    .maximumSize(100)
    .writer(new CacheWriter<String, byte[]>() {
        @Override public void write(String key, byte[] value) {
            rocksDB.put(key.getBytes(), value); // 同步寫(xiě)入磁盤(pán)
        }
        @Override public void delete(String key, byte[] value, RemovalCause cause) {
            rocksDB.delete(key.getBytes());
        }
    })
    .build();

8. 事件監(jiān)聽(tīng)

功能:監(jiān)聽(tīng)緩存變更事件。

Cache<String, String> cache = Caffeine.newBuilder()
    .removalListener((key, value, cause) -> 
        System.out.println("移除事件: " + key + " -> " + cause))
    .evictionListener((key, value, cause) -> 
        System.out.println("驅(qū)逐事件: " + key + " -> " + cause))
    .build();

本地緩存方案選型

1. ConcurrentHashMap

ConcurrentHashMap是Java集合框架中提供的線(xiàn)程安全哈希表實(shí)現(xiàn),首次出現(xiàn)在JDK1.5中。它采用分段鎖技術(shù)(JDK8后改為CAS+synchronized優(yōu)化),通過(guò)將數(shù)據(jù)分成多個(gè)段(segment),每個(gè)段獨(dú)立加鎖,實(shí)現(xiàn)了高并發(fā)的讀寫(xiě)能力。

作為JUC(java.util.concurrent)包的核心組件,它被廣泛應(yīng)用于需要線(xiàn)程安全哈希表的場(chǎng)景。

  • 原生JDK支持,零外部依賴(lài)
  • 讀寫(xiě)性能接近非同步的HashMap
  • 完全線(xiàn)程安全,支持高并發(fā)
  • 提供原子性復(fù)合操作(如computeIfAbsent)
import java.util.concurrent.*;
import java.util.function.Function;

public class CHMCache<K,V> {
    private final ConcurrentHashMap<K,V> map = new ConcurrentHashMap<>(16, 0.75f, 32);
    private final ScheduledExecutorService cleaner = Executors.newSingleThreadScheduledExecutor();
    
    // 基礎(chǔ)操作
    public void put(K key, V value) {
        map.put(key, value);
    }
    
    // 帶TTL的put
    public void put(K key, V value, long ttl, TimeUnit unit) {
        map.put(key, value);
        cleaner.schedule(() -> map.remove(key), ttl, unit);
    }
    
    // 自動(dòng)加載
    public V get(K key, Function<K,V> loader) {
        return map.computeIfAbsent(key, loader);
    }
    
    // 批量操作
    public void putAll(Map<? extends K, ? extends V> m) {
        map.putAll(m);
    }
    
    // 清空緩存
    public void clear() {
        map.clear();
    }
}

2. Guava Cache

Guava Cache是Google Guava庫(kù)中的緩存組件,誕生于2011年。作為ConcurrentHashMap的增強(qiáng)版,它添加了緩存特有的特性。Guava項(xiàng)目本身是Google內(nèi)部Java開(kāi)發(fā)的標(biāo)準(zhǔn)庫(kù),經(jīng)過(guò)大規(guī)模生產(chǎn)環(huán)境驗(yàn)證,穩(wěn)定性和性能都有保障。Guava Cache廣泛應(yīng)用于各種需要本地緩存的Java項(xiàng)目中。

  • Google背書(shū),質(zhì)量有保證
  • 豐富的緩存特性
  • 良好的API設(shè)計(jì)
  • 完善的文檔和社區(qū)支持
<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>31.1-jre</version>
</dependency>
import com.google.common.cache.*;
import java.util.concurrent.TimeUnit;

public class GuavaCacheDemo {
    public static void main(String[] args) {
        LoadingCache<String, String> cache = CacheBuilder.newBuilder()
            .maximumSize(1000) // 最大條目數(shù)
            .expireAfterWrite(10, TimeUnit.MINUTES) // 寫(xiě)入后過(guò)期時(shí)間
            .expireAfterAccess(30, TimeUnit.MINUTES) // 訪(fǎng)問(wèn)后過(guò)期時(shí)間
            .concurrencyLevel(8) // 并發(fā)級(jí)別
            .recordStats() // 開(kāi)啟統(tǒng)計(jì)
            .removalListener(notification -> 
                System.out.println("Removed: " + notification.getKey()))
            .build(new CacheLoader<String, String>() {
                @Override
                public String load(String key) throws Exception {
                    return loadFromDB(key);
                }
            });
        
        try {
            // 自動(dòng)加載
            String value = cache.get("user:1001");
            
            // 手動(dòng)操作
            cache.put("config:timeout", "5000");
            cache.invalidate("user:1001");
            
            // 打印統(tǒng)計(jì)
            System.out.println(cache.stats());
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
    
    private static String loadFromDB(String key) {
        // 模擬數(shù)據(jù)庫(kù)查詢(xún)
        return "DB_Result_" + key;
    }
}

3. Caffeine

Caffeine是Guava Cache作者的新作品,發(fā)布于2015年。它專(zhuān)為現(xiàn)代Java應(yīng)用設(shè)計(jì),采用Window-TinyLFU淘汰算法,相比傳統(tǒng)LRU有更高的命中率。Caffeine充分利用Java 8特性(如CompletableFuture),在性能上大幅超越Guava Cache(3-5倍提升),是目前性能最強(qiáng)的Java本地緩存庫(kù)。

  • 超高性能
  • 更高的緩存命中率
  • 異步刷新機(jī)制
  • 精細(xì)的內(nèi)存控制
<dependency>
  <groupId>com.github.ben-manes.caffeine</groupId>
  <artifactId>caffeine</artifactId>
  <version>2.9.3</version>
</dependency>
import com.github.benmanes.caffeine.cache.*;
import java.util.concurrent.TimeUnit;

public class CaffeineDemo {
    public static void main(String[] args) {
        // 同步緩存
        Cache<String, Data> cache = Caffeine.newBuilder()
            .maximumSize(10_000)
            .expireAfterWrite(5, TimeUnit.MINUTES)
            .expireAfterAccess(10, TimeUnit.MINUTES)
            .refreshAfterWrite(1, TimeUnit.MINUTES)
            .recordStats()
            .build();
        
        // 異步加載緩存
        AsyncLoadingCache<String, Data> asyncCache = Caffeine.newBuilder()
            .maximumWeight(100_000)
            .weigher((String key, Data data) -> data.size())
            .expireAfterWrite(10, TimeUnit.MINUTES)
            .buildAsync(key -> loadFromDB(key));
        
        // 使用示例
        Data data = cache.getIfPresent("key1");
        CompletableFuture<Data> future = asyncCache.get("key1");
        
        // 打印統(tǒng)計(jì)
        System.out.println(cache.stats());
    }
    
    static class Data {
        int size() { return 1; }
    }
    
    private static Data loadFromDB(String key) {
        // 模擬數(shù)據(jù)庫(kù)加載
        return new Data();
    }
}

4. Encache

EEhcache是Terracotta公司開(kāi)發(fā)的企業(yè)級(jí)緩存框架,始于2003年。它是JSR-107標(biāo)準(zhǔn)實(shí)現(xiàn)之一,支持從本地緩存擴(kuò)展到分布式緩存。Ehcache的特色在于支持多級(jí)存儲(chǔ)(堆內(nèi)/堆外/磁盤(pán)),適合需要緩存持久化的企業(yè)級(jí)應(yīng)用。

最新版本Ehcache 3.x完全重構(gòu),提供了更現(xiàn)代的API設(shè)計(jì)。

  • 企業(yè)級(jí)功能支持
  • 多級(jí)存儲(chǔ)架構(gòu)
  • 完善的監(jiān)控管理
  • 良好的擴(kuò)展性
<dependency>
  <groupId>org.ehcache</groupId>
  <artifactId>ehcache</artifactId>
  <version>3.9.7</version>
</dependency>
import org.ehcache.*;
import org.ehcache.config.*;
import org.ehcache.config.builders.*;
import java.time.Duration;

public class EhcacheDemo {
    public static void main(String[] args) {
        // 1. 配置緩存管理器
        CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
            .with(CacheManagerBuilder.persistence("/tmp/ehcache-data"))
            .build();
        cacheManager.init();
        
        // 2. 配置緩存
        CacheConfiguration<String, String> config = CacheConfigurationBuilder
            .newCacheConfigurationBuilder(
                String.class, 
                String.class,
                ResourcePoolsBuilder.newResourcePoolsBuilder()
                    .heap(1000, EntryUnit.ENTRIES)  // 堆內(nèi)
                    .offheap(100, MemoryUnit.MB)    // 堆外
                    .disk(1, MemoryUnit.GB, true)   // 磁盤(pán)
            )
            .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofMinutes(10)))
            .build();
        
        // 3. 創(chuàng)建緩存
        Cache<String, String> cache = cacheManager.createCache("myCache", config);
        
        // 4. 使用緩存
        cache.put("key1", "value1");
        String value = cache.get("key1");
        System.out.println(value);
        
        // 5. 關(guān)閉
        cacheManager.close();
    }
}

方案對(duì)比

特性

ConcurrentHashMap

Guava Cache

Caffeine

Ehcache

基本緩存功能

?

?

?

?

過(guò)期策略

?

?

?

?

淘汰算法

?

LRU

W-TinyLFU

LRU/LFU

自動(dòng)加載

?

?

?

?

異步加載

?

?

?

?

持久化支持

?

?

?

?

多級(jí)存儲(chǔ)

?

?

?

?

命中率統(tǒng)計(jì)

?

基本

詳細(xì)

詳細(xì)

分布式支持

?

?

?

?

內(nèi)存占用

本地緩存問(wèn)題及解決

1. 數(shù)據(jù)一致性

兩級(jí)緩存與數(shù)據(jù)庫(kù)的數(shù)據(jù)要保持一致,一旦數(shù)據(jù)發(fā)生了修改,在修改數(shù)據(jù)庫(kù)的同時(shí),本地緩存、遠(yuǎn)程緩存應(yīng)該同步更新。

1.1. 解決方案1: 失效廣播機(jī)制

通過(guò)Redis PubSub或Rabbit MQ等消息中間件實(shí)現(xiàn)跨節(jié)點(diǎn)通知

  • 優(yōu)點(diǎn):實(shí)時(shí)性較好,能快速同步變更
  • 缺點(diǎn):增加了系統(tǒng)復(fù)雜度,網(wǎng)絡(luò)分區(qū)時(shí)可能失效

如果你不想在你的業(yè)務(wù)代碼發(fā)送MQ消息,還可以適用近幾年比較流行的方法:訂閱數(shù)據(jù)庫(kù)變更日志,再操作緩存。Canal 訂閱Mysql的 Binlog日志,當(dāng)發(fā)生變化時(shí)向MQ發(fā)送消息,進(jìn)而也實(shí)現(xiàn)數(shù)據(jù)一致性。

1.2. 解決方案2:版本號(hào)控制

實(shí)現(xiàn)原理:

  • 在數(shù)據(jù)庫(kù)表中增加版本號(hào)字段(version)
  • 緩存數(shù)據(jù)時(shí)同時(shí)存儲(chǔ)版本號(hào)
  • 查詢(xún)時(shí)比較緩存版本與數(shù)據(jù)庫(kù)版本
// 版本號(hào)校驗(yàn)示例
public Product getProduct(long id) {
CacheEntry entry = localCache.get(id);
if (entry != null) {
    int dbVersion = db.query("SELECT version FROM products WHERE id=?", id);
    if (entry.version == dbVersion) {
        return entry.product; // 版本一致,返回緩存
    }
}
// 版本不一致或緩存不存在,從數(shù)據(jù)庫(kù)加載
Product product = db.loadProduct(id);
localCache.put(id, new CacheEntry(product, product.getVersion()));
return product;
}

2. 內(nèi)存管理問(wèn)題

2.1. 解決方案1:分層緩存架構(gòu)

// 組合堆內(nèi)與堆外緩存
Cache<String, Object> multiLevelCache = Caffeine.newBuilder()
.maximumSize(10_000) // 一級(jí)緩存(堆內(nèi))
.buildAsync(key -> {
    Object value = offHeapCache.get(key); // 二級(jí)緩存(堆外)
    if(value == null) value = loadFromDB(key);
    return value;
});
  • 使用Window-TinyLFU算法自動(dòng)識(shí)別熱點(diǎn)
  • 對(duì)TOP 1%的熱點(diǎn)數(shù)據(jù)單獨(dú)配置更大容量

2.2. 解決方案2:智能淘汰策略

策略類(lèi)型

適用場(chǎng)景

配置示例

基于大小

固定數(shù)量的小對(duì)象

maximumSize(10_000)

基于權(quán)重

大小差異顯著的對(duì)象

maximumWeight(1GB).weigher()

基于時(shí)間

時(shí)效性強(qiáng)的數(shù)據(jù)

expireAfterWrite(5min)

基于引用

非核心數(shù)據(jù)

softValues()

3. GC壓力

3.1. GC壓力問(wèn)題的產(chǎn)生原因

緩存對(duì)象生命周期特征:

  • 本地緩存通常持有大量長(zhǎng)期存活對(duì)象(如商品信息、配置數(shù)據(jù))
  • 與傳統(tǒng)短期對(duì)象(如HTTP請(qǐng)求作用域?qū)ο螅┎煌?,這些對(duì)象會(huì)持續(xù)晉升到老年代
  • 示例:1GB的本地緩存意味著老年代常駐1GB可達(dá)對(duì)象

內(nèi)存結(jié)構(gòu)影響:

// 典型緩存數(shù)據(jù)結(jié)構(gòu)帶來(lái)的內(nèi)存開(kāi)銷(xiāo)
ConcurrentHashMap<String, Product> cache = new ConcurrentHashMap<>();
// 實(shí)際內(nèi)存占用 = 鍵對(duì)象 + 值對(duì)象 + 哈希表Entry對(duì)象(約額外增加40%開(kāi)銷(xiāo))

GC行為變化表現(xiàn):

  • Full GC頻率上升:從2次/天 → 15次/天(如問(wèn)題描述)
  • 停頓時(shí)間增長(zhǎng):STW時(shí)間從120ms → 可能達(dá)到秒級(jí)(取決于堆大?。?/li>
  • 晉升失敗風(fēng)險(xiǎn):當(dāng)緩存大小接近老年代容量時(shí),容易觸發(fā)Concurrent Mode Failure

3.2. 解決方案1:堆外緩存(Off-Heap Cache)

// 使用OHC(Off-Heap Cache)示例
OHCache<String, Product> ohCache = OHCacheBuilder.newBuilder()
.keySerializer(new StringSerializer())
.valueSerializer(new ProductSerializer())
.capacity(1, Unit.GB)
.build();

優(yōu)勢(shì):

  • 完全繞過(guò)JVM堆內(nèi)存管理
  • 不受GC影響,內(nèi)存由操作系統(tǒng)直接管理
  • 可突破JVM堆大小限制(如緩存50GB數(shù)據(jù))

代價(jià):

  • 需要手動(dòng)實(shí)現(xiàn)序列化/反序列化
  • 讀取時(shí)存在內(nèi)存拷貝開(kāi)銷(xiāo)(比堆內(nèi)緩存慢約20-30%)

3.3. 方案2:分區(qū)域緩存

// 按業(yè)務(wù)劃分獨(dú)立緩存實(shí)例
public class CacheRegistry {
    private static LoadingCache<String, Product> productCache = ...;  // 商品專(zhuān)用
    private static LoadingCache<Integer, UserProfile> userCache = ...; // 用戶(hù)專(zhuān)用

    // 獨(dú)立配置各緩存參數(shù)
    static {
        productCache = Caffeine.newBuilder()
        .maximumSize(10_000)
        .build(...);

        userCache = Caffeine.newBuilder()
        .maximumWeight(100MB)
        .weigher(...)
        .build(...);
    }
}

效果:

  • 避免單一超大緩存域?qū)е氯諫C壓力
  • 可針對(duì)不同業(yè)務(wù)設(shè)置差異化淘汰策略

總結(jié)

通過(guò)以上的分析和實(shí)現(xiàn),可以通過(guò)Redis+Caffeine實(shí)現(xiàn)高性能二級(jí)緩存實(shí)現(xiàn)。

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

相關(guān)文章

  • Redis實(shí)現(xiàn)商品秒殺的示例代碼

    Redis實(shí)現(xiàn)商品秒殺的示例代碼

    本文主要介紹了Redis實(shí)現(xiàn)商品秒殺的示例代碼,詳細(xì)介紹了Redis的List、Set和Hash類(lèi)型,以及使用Redis事務(wù)保證原子性的方式,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Redis高可用梳理詳解

    Redis高可用梳理詳解

    高可用的本質(zhì)是有備份,在出現(xiàn)故障的時(shí)候,有backup可以提供服務(wù),本文詳細(xì)介紹了Redis的高可用,感興趣的同學(xué)可以參考閱讀
    2023-05-05
  • CentOS6.4 安裝Redis 教程詳解

    CentOS6.4 安裝Redis 教程詳解

    這篇文章主要介紹了CentOS6.4 安裝Redis 教程詳解,需要的朋友可以參考下
    2017-05-05
  • Redis中ServiceStack.Redis和StackExchange.Redis區(qū)別詳解

    Redis中ServiceStack.Redis和StackExchange.Redis區(qū)別詳解

    本文主要介紹了Redis中ServiceStack.Redis和StackExchange.Redis區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • redis復(fù)制有可能碰到的問(wèn)題匯總

    redis復(fù)制有可能碰到的問(wèn)題匯總

    這篇文章主要介紹了redis復(fù)制有可能碰到的問(wèn)題匯總,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • phpredis提高消息隊(duì)列的實(shí)時(shí)性方法(推薦)

    phpredis提高消息隊(duì)列的實(shí)時(shí)性方法(推薦)

    下面小編就為大家?guī)?lái)一篇phpredis提高消息隊(duì)列的實(shí)時(shí)性方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • redis?zrange?與?zrangebyscore的區(qū)別解析

    redis?zrange?與?zrangebyscore的區(qū)別解析

    這篇文章主要介紹了redis?zrange與zrangebyscore的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • 基于Redis緩存數(shù)據(jù)常見(jiàn)的三種問(wèn)題及解決

    基于Redis緩存數(shù)據(jù)常見(jiàn)的三種問(wèn)題及解決

    這篇文章主要介紹了基于Redis緩存數(shù)據(jù)常見(jiàn)的三種問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Redis之Key過(guò)期策略的用法解讀

    Redis之Key過(guò)期策略的用法解讀

    這篇文章主要介紹了Redis之Key過(guò)期策略的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 使用Redis實(shí)現(xiàn)點(diǎn)贊取消點(diǎn)贊的詳細(xì)代碼

    使用Redis實(shí)現(xiàn)點(diǎn)贊取消點(diǎn)贊的詳細(xì)代碼

    這篇文章主要介紹了Redis實(shí)現(xiàn)點(diǎn)贊取消點(diǎn)贊的詳細(xì)代碼,通過(guò)查詢(xún)某實(shí)體(帖子、評(píng)論等)點(diǎn)贊數(shù)量,需要用到事務(wù)相關(guān)知識(shí),結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03

最新評(píng)論