緩存技術(shù):本地緩存與分布式緩存

一江场、本地緩存框架

本地緩存框架適用于單機(jī)應(yīng)用場(chǎng)景飘千,可以通過(guò)緩存來(lái)提高數(shù)據(jù)訪問(wèn)的速度和效率染坯。Ehcache羹应、Guava Cache 和 Caffeine 都是常見(jiàn)的本地緩存框架,它們?cè)趯?shí)現(xiàn)本地緩存的功能方面有所不同散休。

適用場(chǎng)景:適用于單機(jī)應(yīng)用場(chǎng)景媒楼,可以通過(guò)緩存來(lái)提高數(shù)據(jù)訪問(wèn)的速度和效率,減少數(shù)據(jù)庫(kù)的壓力和響應(yīng)時(shí)間戚丸。

1划址、Ehcache

1.1 簡(jiǎn)介

Ehcache是一個(gè)開(kāi)源的Java分布式緩存框架,由Terracotta公司開(kāi)發(fā)昏滴,它是一個(gè)廣泛使用的緩存框架猴鲫,為Java應(yīng)用程序提供了性能優(yōu)化和可擴(kuò)展性。Ehcache可以在Java應(yīng)用程序中存儲(chǔ)緩存數(shù)據(jù)谣殊,提供快速響應(yīng)和優(yōu)化性能拂共。Ehcache還支持多個(gè)緩存策略,包括FIFO姻几、LRU和LFU等宜狐,可以根據(jù)具體場(chǎng)景選擇最適合的緩存策略。除此之外蛇捌,Ehcache還提供了分布式緩存功能抚恒,支持多個(gè)緩存節(jié)點(diǎn)之間的數(shù)據(jù)同步和共享。

Ehcache 優(yōu)點(diǎn):

  • 易于使用:Ehcache 提供了簡(jiǎn)單易用的 API络拌,可以輕松地將其集成到項(xiàng)目中俭驮,同時(shí)也提供了豐富的配置選項(xiàng),可以根據(jù)實(shí)際需求進(jìn)行調(diào)整。
  • 高性能:Ehcache 的緩存性能非常出色混萝,可以大大減少應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)的次數(shù)遗遵,提高系統(tǒng)的性能和響應(yīng)速度。
  • 可擴(kuò)展性:Ehcache 支持多級(jí)緩存逸嘀、緩存復(fù)制和集群部署等功能车要,可以輕松地實(shí)現(xiàn)分布式緩存,提高系統(tǒng)的可擴(kuò)展性和容錯(cuò)性崭倘。
  • 可靠性:Ehcache 提供了完善的緩存管理和監(jiān)控功能翼岁,可以確保緩存數(shù)據(jù)的可靠性和一致性。
  • 支持多種緩存策略:Ehcache 支持多種緩存策略司光,如 LFU琅坡、LRU、FIFO 等飘庄,可以根據(jù)實(shí)際需求進(jìn)行選擇和配置脑蠕。

Ehcache 缺點(diǎn):

  • 緩存數(shù)據(jù)存儲(chǔ)在本地內(nèi)存中,無(wú)法實(shí)現(xiàn)數(shù)據(jù)共享和數(shù)據(jù)備份跪削,容易造成緩存擊穿、緩存穿透等問(wèn)題迂求。
  • 對(duì)緩存數(shù)據(jù)的管理和維護(hù)需要占用應(yīng)用程序的內(nèi)存資源碾盐,可能會(huì)對(duì)應(yīng)用程序的性能產(chǎn)生一定的影響。
  • 在集群環(huán)境下需要額外的配置和管理工作揩局,相對(duì)較為復(fù)雜毫玖。

1.2 官方文檔

https://www.ehcache.org/documentation/

1.3 Java配置示例

// 創(chuàng)建緩存管理器
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder().build();
cacheManager.init();

// 創(chuàng)建緩存實(shí)例
Cache<Integer, String> cache = cacheManager.createCache("myCache",
        CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class,
                ResourcePoolsBuilder.heap(100)));

// 將元素放入緩存
cache.put(1, "Hello, Ehcache!");

// 從緩存中獲取元素
String result = cache.get(1);

// 關(guān)閉緩存管理器
cacheManager.close();

1.4 緩存策略

最近最少使用策略(Least Recently Used, LRU)

將最近最少使用的對(duì)象從緩存中刪除,保留最常用的對(duì)象凌盯。

先進(jìn)先出策略(First In First Out, FIFO)

按照對(duì)象進(jìn)入緩存的順序付枫,先進(jìn)先出地淘汰對(duì)象。

最近最少使用時(shí)間策略(Least Recently Used Time, LRUT)

類似于LRU策略驰怎,但考慮了對(duì)象最后一次訪問(wèn)時(shí)間阐滩,最近使用時(shí)間較早的對(duì)象被淘汰。

最不經(jīng)常使用策略(Least Frequently Used, LFU)

淘汰一段時(shí)間內(nèi)使用頻率最少的對(duì)象县忌。

基于權(quán)重的策略(Weighted Random Early Detection, WRED)

將權(quán)重較低的對(duì)象從緩存中刪除掂榔,權(quán)重越高的對(duì)象保留的幾率越大。

同步策略(Synchronous)

所有的寫(xiě)操作將被同步到緩存和持久化存儲(chǔ)中症杏,適合要求高可靠性的場(chǎng)景装获。

異步策略(Asynchronous)

寫(xiě)操作首先寫(xiě)入緩存,然后異步地寫(xiě)入持久化存儲(chǔ)厉颤,適合對(duì)可靠性要求不高的場(chǎng)景穴豫。

永久緩存策略(Eternal)

對(duì)象永遠(yuǎn)不會(huì)過(guò)期,適合靜態(tài)數(shù)據(jù)逼友。

時(shí)間緩存策略(Time To Live, TTL)

對(duì)象存活一定的時(shí)間后將過(guò)期精肃。

訪問(wèn)緩存策略(Time To Idle, TTI)

對(duì)象在一定時(shí)間內(nèi)未被訪問(wèn)后將過(guò)期秤涩。

2、Guava Cache

2.1 簡(jiǎn)介

Guava Cache是Google Guava庫(kù)中提供的一種本地緩存框架肋杖,它為應(yīng)用程序提供了一種輕量級(jí)的緩存解決方案溉仑。Guava Cache提供了一些簡(jiǎn)單易用的API,可以用來(lái)構(gòu)建基于內(nèi)存的本地緩存状植,并支持多種緩存策略浊竟,包括基于時(shí)間和大小的緩存清除、手動(dòng)清除緩存津畸、緩存項(xiàng)回收等振定。

Guava Cache 優(yōu)點(diǎn):

  • 簡(jiǎn)單易用:Guava Cache 提供了簡(jiǎn)單易用的 API,可以非常方便地使用本地緩存。
  • 高性能:Guava Cache 是一款高性能的本地緩存實(shí)現(xiàn),使用 Guava Cache 可以大大提升應(yīng)用程序的訪問(wèn)性能矿辽。
  • 靈活性高:Guava Cache 提供了靈活的緩存配置選項(xiàng)宦赠,可以根據(jù)業(yè)務(wù)場(chǎng)景進(jìn)行優(yōu)化和調(diào)整。
  • 易于集成:Guava Cache 可以非常容易地集成到 Java 應(yīng)用程序中务豺,只需要添加對(duì)應(yīng)的 Maven 依賴即可。

Guava Cache 缺點(diǎn):

  • 本地緩存:Guava Cache 是一款本地緩存實(shí)現(xiàn),只能用于單個(gè)節(jié)點(diǎn)的緩存場(chǎng)景露久,無(wú)法滿足分布式緩存的需求。
  • 大規(guī)模緩存:Guava Cache 適用于中小規(guī)模緩存欺栗,對(duì)于大規(guī)模緩存場(chǎng)景需要考慮分布式緩存實(shí)現(xiàn)毫痕。
  • 沒(méi)有緩存淘汰策略:Guava Cache 缺乏像 Redis、Ehcache 那樣完善的緩存淘汰策略迟几,需要手動(dòng)設(shè)置緩存失效時(shí)間來(lái)達(dá)到類似的效果消请。

2.2 官方文檔

https://github.com/google/guava/wiki/CachesExplained

2.3 Java配置示例

// 創(chuàng)建緩存實(shí)例
Cache<Integer, String> cache = CacheBuilder.newBuilder()
        .expireAfterWrite(10, TimeUnit.MINUTES)
        .maximumSize(1000)
        .build();

// 將元素放入緩存
cache.put(1, "Hello, Guava Cache!");

// 從緩存中獲取元素
String result = cache.getIfPresent(1);

// 關(guān)閉緩存
cache.invalidateAll();

2.4 緩存策略

基于容量的回收策略

該策略基于緩存中元素的數(shù)量,設(shè)置緩存最大容量类腮,一旦超過(guò)該容量臊泰,將使用最近最少使用算法(LRU)清除最近最少使用的緩存項(xiàng)。

基于大小的回收策略

該策略基于緩存項(xiàng)占用的空間大小來(lái)限制緩存項(xiàng)的數(shù)量存哲。一旦超過(guò)了緩存的最大容量因宇,就會(huì)使用LRU算法來(lái)清除最近最少使用的緩存項(xiàng),以便為新緩存項(xiàng)騰出空間祟偷。

基于時(shí)間的回收策略

該策略基于緩存項(xiàng)的過(guò)期時(shí)間來(lái)清除緩存項(xiàng)察滑。當(dāng)緩存項(xiàng)超過(guò)指定的時(shí)間范圍時(shí),它將被清除修肠。緩存項(xiàng)可以在創(chuàng)建時(shí)指定過(guò)期時(shí)間贺辰,也可以通過(guò)調(diào)用CacheBuilder.expireAfterWrite(long, TimeUnit)方法來(lái)設(shè)置默認(rèn)的過(guò)期時(shí)間。

基于引用的回收策略

該策略將緩存項(xiàng)與GC的回收進(jìn)行結(jié)合。這意味著緩存項(xiàng)將在虛擬機(jī)需要回收內(nèi)存時(shí)被清除饲化。Guava Cache支持兩種類型的引用:弱引用和軟引用莽鸭。當(dāng)緩存項(xiàng)的鍵或值被回收時(shí),緩存項(xiàng)將被自動(dòng)清除吃靠。

手動(dòng)回收策略

該策略允許使用者手動(dòng)清除緩存項(xiàng)硫眨,通過(guò)調(diào)用Cache.invalidate(Object)或Cache.invalidateAll()方法實(shí)現(xiàn)。這對(duì)于在緩存中放置需要即時(shí)失效的數(shù)據(jù)非常有用巢块。

組合回收策略

Guava Cache還支持將多個(gè)回收策略組合使用礁阁。例如,可以將基于時(shí)間的回收策略與基于容量的回收策略相結(jié)合族奢,以便在緩存過(guò)期之前限制緩存的最大容量姥闭。這個(gè)可以通過(guò)調(diào)用CacheBuilder.maximumSize(long).expireAfterWrite(long, TimeUnit)方法實(shí)現(xiàn)。

總的來(lái)說(shuō)越走,Guava Cache提供了豐富的緩存策略棚品,可以根據(jù)應(yīng)用程序的不同需求進(jìn)行自由組合,參考官方文檔廊敌。

3铜跑、Caffeine

3.1 簡(jiǎn)介

Caffeine是一個(gè)基于Java 8的高性能緩存庫(kù),提供了一些常用緩存功能骡澈,如緩存過(guò)期疼进、自動(dòng)加載、統(tǒng)計(jì)等秧廉,并且具有內(nèi)存友好、高性能拣帽、線程安全等特點(diǎn)疼电。Caffeine支持多種緩存策略,如基于容量减拭、基于時(shí)間蔽豺、基于權(quán)重、手動(dòng)移除拧粪、定時(shí)刷新等修陡,并提供了豐富的配置選項(xiàng),能夠適應(yīng)不同的應(yīng)用場(chǎng)景和需求可霎。Caffeine也是Spring框架中緩存抽象接口的默認(rèn)實(shí)現(xiàn)魄鸦。

Caffeine 優(yōu)點(diǎn):

  • 更快的緩存讀寫(xiě)性能,具有更高的吞吐量和更低的延遲
  • 支持更多的緩存策略和選項(xiàng)癣朗,更靈活和可定制
  • 更少的內(nèi)存占用和更好的緩存效率
  • 支持異步加載和刷新緩存項(xiàng)
  • 可以與Spring等框架無(wú)縫集成

Caffeine 缺點(diǎn):

  • 不支持分布式緩存
  • 沒(méi)有Guava Cache的緩存預(yù)熱功能
  • 不支持緩存項(xiàng)失效的監(jiān)聽(tīng)器

3.2 官方文檔

https://github.com/ben-manes/caffeine/wiki

3.3 Java配置示例

// 創(chuàng)建緩存實(shí)例
Cache<Integer, String> cache = Caffeine.newBuilder()
        .expireAfterWrite(10, TimeUnit.MINUTES)
        .maximumSize(1000)
        .build();

// 將元素放入緩存
cache.put(1, "Hello, Caffeine!");

// 從緩存中獲取元素
String result = cache.getIfPresent(1);

// 關(guān)閉緩存
cache.invalidateAll();

3.4 緩存策略

最近最少使用策略(LRU)

緩存的數(shù)據(jù)按照訪問(wèn)時(shí)間排序拾因,每次淘汰最久未被訪問(wèn)的數(shù)據(jù)。優(yōu)點(diǎn)是容易實(shí)現(xiàn),缺點(diǎn)是無(wú)法適應(yīng)一些特殊場(chǎng)景绢记,例如緩存數(shù)據(jù)的訪問(wèn)頻率差異很大的場(chǎng)景扁达。

最少使用次數(shù)策略(LFU)

緩存的數(shù)據(jù)按照被訪問(wèn)次數(shù)排序,每次淘汰訪問(wèn)次數(shù)最少的數(shù)據(jù)蠢熄。該策略適合訪問(wèn)頻率穩(wěn)定的數(shù)據(jù)跪解。

固定容量策略(Fixed Size)

緩存數(shù)據(jù)容量固定,當(dāng)容量滿時(shí)签孔,采用LRU或其他策略進(jìn)行淘汰叉讥。

固定重量策略(Weigher)

緩存數(shù)據(jù)容量固定,但不是按照數(shù)據(jù)條目數(shù)量來(lái)計(jì)算的骏啰,而是按照緩存數(shù)據(jù)的重量來(lái)計(jì)算节吮,當(dāng)重量達(dá)到上限時(shí),采用LRU或其他策略進(jìn)行淘汰判耕。

時(shí)間過(guò)期策略(Time-based expiration)

緩存數(shù)據(jù)存儲(chǔ)的時(shí)間固定透绩,一旦存儲(chǔ)時(shí)間超過(guò)預(yù)設(shè)時(shí)間,緩存數(shù)據(jù)將被淘汰壁熄。

寫(xiě)入過(guò)期策略(Write expiration)

緩存數(shù)據(jù)在寫(xiě)入時(shí)帚豪,可以設(shè)置其存儲(chǔ)時(shí)間,一旦存儲(chǔ)時(shí)間超過(guò)預(yù)設(shè)時(shí)間草丧,緩存數(shù)據(jù)將被淘汰狸臣。

訪問(wèn)過(guò)期策略(Access expiration)

緩存數(shù)據(jù)在最近一次訪問(wèn)之后,經(jīng)過(guò)預(yù)設(shè)時(shí)間后將被淘汰昌执。

異步刷新策略(Asynchronous Refreshing)

緩存數(shù)據(jù)在被淘汰前烛亦,會(huì)異步地進(jìn)行刷新。該策略適用于緩存數(shù)據(jù)很難預(yù)測(cè)何時(shí)失效懂拾,但刷新緩存數(shù)據(jù)的代價(jià)比重新加載要小的情況煤禽。

記錄統(tǒng)計(jì)策略(Record Statistics)

對(duì)緩存的訪問(wèn)次數(shù)、命中率等進(jìn)行統(tǒng)計(jì)岖赋,便于后續(xù)的優(yōu)化和管理檬果。

手動(dòng)加載策略(Manual Loading)

手動(dòng)將緩存數(shù)據(jù)加載到緩存中,適用于加載緩存數(shù)據(jù)的代價(jià)較大的情況唐断。

SoftValues

使用軟引用作為value的引用類型选脊,當(dāng)JVM內(nèi)存不足時(shí),可能會(huì)回收一些value脸甘,以盡量保留剩余的內(nèi)存恳啥。

WeakKeys

使用弱引用作為key的引用類型,當(dāng)key沒(méi)有被其他對(duì)象引用時(shí)斤程,可能會(huì)被垃圾回收器回收角寸。

WeakValues

使用弱引用作為value的引用類型菩混,當(dāng)value沒(méi)有被其他對(duì)象引用時(shí),可能會(huì)被垃圾回收器回收扁藕。

WeakKeysWeakValues

同時(shí)使用弱引用作為key和value的引用類型沮峡,當(dāng)key和value都沒(méi)有被其他對(duì)象引用時(shí),可能會(huì)被垃圾回收器回收亿柑。

這些緩存策略的具體實(shí)現(xiàn)方式和使用場(chǎng)景可以參考Caffeine的官方文檔邢疙。

比較

特性比較

特性/框架 Ehcache Guava Cache Caffeine
緩存類型 磁盤(pán)、內(nèi)存 內(nèi)存 內(nèi)存
并發(fā)處理 一般 一般 強(qiáng)
自動(dòng)回收
容量限制
內(nèi)存占用 中等
分布式支持 支持 不支持 不支持
支持API版本 2.x望薄、3.x 10.x疟游、11.x、21.x 2.x痕支、3.x
開(kāi)源許可證 Apache 2.0 Apache 2.0 Apache 2.0

Ehcache 3.x 支持分布式颁虐,但與 2.x 版本有較大差異。Guava Cache 主要作為本地緩存框架使用卧须。Caffeine 支持 Java 8 及以上版本另绩,比 Guava Cache 性能更好,擁有更多高級(jí)特性花嘶,但同時(shí)也更復(fù)雜笋籽。

  • 功能和特性:
    Ehcache 和 Guava Cache 都是基于緩存對(duì)象的大小和時(shí)間限制的 LRU 算法實(shí)現(xiàn)的,可以對(duì)緩存的元素進(jìn)行自動(dòng)過(guò)期椭员、剔除和大小限制等操作车海。而 Caffeine 則是基于緩存的訪問(wèn)模式和大小進(jìn)行緩存元素的淘汰,可以使用不同的淘汰算法隘击,如 LRU侍芝、LFU 和 W-TinyLFU 等。

  • 并發(fā)性能:
    在并發(fā)性能方面埋同,Caffeine 是最快的本地緩存框架竭贩,其使用了多種并發(fā)技術(shù)來(lái)保證緩存的并發(fā)訪問(wèn)性能,如并發(fā)哈希表莺禁、CAS 和讀寫(xiě)鎖等。而 Ehcache 和 Guava Cache 在并發(fā)性能方面相對(duì)較差窄赋,不支持并發(fā)訪問(wèn)哟冬,可能會(huì)出現(xiàn)線程安全問(wèn)題。

  • 內(nèi)存占用:
    在內(nèi)存占用方面忆绰,Caffeine 的內(nèi)存占用最小浩峡,因?yàn)槠涫褂昧艘恍┨厥獾臄?shù)據(jù)結(jié)構(gòu)和算法來(lái)減小內(nèi)存占用,如堆外內(nèi)存和布隆過(guò)濾器等错敢。而 Ehcache 和 Guava Cache 的內(nèi)存占用相對(duì)較大翰灾,可能會(huì)導(dǎo)致內(nèi)存浪費(fèi)和緩存性能下降缕粹。

  • 分布式緩存支持:
    Ehcache 提供了分布式緩存的支持,可以將緩存對(duì)象存儲(chǔ)在多個(gè)節(jié)點(diǎn)上纸淮,以提高緩存的可用性和可擴(kuò)展性平斩。而 Guava Cache 和 Caffeine 不支持分布式緩存,只能用作本地緩存咽块。

綜上所述绘面,Ehcache 在分布式緩存和并發(fā)性能方面較為優(yōu)秀,但內(nèi)存占用較大侈沪;Guava Cache 是一個(gè)輕量級(jí)的本地緩存框架揭璃,具有簡(jiǎn)單易用的特點(diǎn),但并發(fā)性能較弱亭罪;Caffeine 則是一個(gè)快速瘦馍、高效、內(nèi)存占用小的本地緩存框架应役,適合需要高性能和低內(nèi)存占用的場(chǎng)景情组。

緩存策略比較

緩存策略 Ehcache Guava Cache Caffeine
最近最少使用 (LRU) 支持 支持 支持
最近最少使用 (LIRS) 不支持 不支持 支持
最近最少使用 (LFU) 支持 不支持 支持
時(shí)間過(guò)期 (TTI) 支持 支持 支持
基于容量的大小 (基于條目數(shù)量) 支持 支持 支持
基于容量的大小 (基于緩存值的大小) 支持 支持 支持
固定大小 支持 不支持 不支持
內(nèi)存敏感 支持 支持 支持
弱引用 支持 支持 不支持
軟引用 支持 支持 不支持

二、分布式緩存

1扛吞、簡(jiǎn)介

分布式緩存指的是將緩存數(shù)據(jù)存儲(chǔ)在多臺(tái)服務(wù)器上呻惕,通過(guò)協(xié)調(diào)和通信來(lái)實(shí)現(xiàn)數(shù)據(jù)的一致性和高可用性的一種緩存技術(shù)。與傳統(tǒng)的本地緩存相比滥比,分布式緩存可以提高系統(tǒng)的性能和可擴(kuò)展性亚脆,適用于高并發(fā)和大規(guī)模數(shù)據(jù)的場(chǎng)景。

2盲泛、業(yè)務(wù)場(chǎng)景

  • 高并發(fā)讀缺舫帧:對(duì)于訪問(wèn)頻率較高的數(shù)據(jù),可以將其緩存在分布式緩存中寺滚,減少對(duì)數(shù)據(jù)庫(kù)等存儲(chǔ)系統(tǒng)的壓力柑营,提高讀取性能。
  • 高并發(fā)寫(xiě)入:對(duì)于需要頻繁寫(xiě)入的數(shù)據(jù)村视,通過(guò)分布式緩存可以減少對(duì)數(shù)據(jù)庫(kù)等存儲(chǔ)系統(tǒng)的寫(xiě)入次數(shù)官套,提高寫(xiě)入性能。
  • 減少資源占用:通過(guò)緩存可以減少對(duì)存儲(chǔ)系統(tǒng)蚁孔、網(wǎng)絡(luò)等資源的占用奶赔,提高系統(tǒng)的可擴(kuò)展性和可靠性。
  • 數(shù)據(jù)共享:通過(guò)分布式緩存可以實(shí)現(xiàn)多個(gè)應(yīng)用程序之間共享數(shù)據(jù)杠氢,提高系統(tǒng)之間的協(xié)同能力站刑。
  • 數(shù)據(jù)安全:通過(guò)緩存可以緩存已處理的數(shù)據(jù),減少對(duì)用戶信息的讀取和處理鼻百,從而提高數(shù)據(jù)的安全性绞旅。

3摆尝、作用/目的

  • 提高應(yīng)用性能:緩存可以將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,從而提高讀取數(shù)據(jù)的速度因悲,減輕數(shù)據(jù)庫(kù)等后端系統(tǒng)的負(fù)載堕汞,提高應(yīng)用的性能。
  • 減少數(shù)據(jù)庫(kù)訪問(wèn):緩存可以將一些常用的數(shù)據(jù)存儲(chǔ)在緩存中囤捻,從而減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)次數(shù)臼朗,降低了對(duì)數(shù)據(jù)庫(kù)的壓力,減少了對(duì)數(shù)據(jù)庫(kù)的負(fù)載蝎土。
  • 實(shí)現(xiàn)數(shù)據(jù)共享:分布式緩存可以將數(shù)據(jù)緩存到多個(gè)節(jié)點(diǎn)中视哑,實(shí)現(xiàn)數(shù)據(jù)共享和數(shù)據(jù)同步。
  • 提高應(yīng)用可擴(kuò)展性:應(yīng)用的性能和可擴(kuò)展性往往是緊密關(guān)聯(lián)的誊涯,緩存可以提高應(yīng)用的性能挡毅,從而提高應(yīng)用的可擴(kuò)展性。
  • 實(shí)現(xiàn)高可用性:緩存可以實(shí)現(xiàn)多節(jié)點(diǎn)的數(shù)據(jù)備份和數(shù)據(jù)同步暴构,從而提高系統(tǒng)的可用性跪呈,減少單點(diǎn)故障的風(fēng)險(xiǎn)。

綜上所述取逾,分布式緩存可以提高應(yīng)用的性能和可擴(kuò)展性耗绿,降低后端系統(tǒng)的負(fù)載,實(shí)現(xiàn)數(shù)據(jù)共享和高可用性等砾隅。

4误阻、常見(jiàn)問(wèn)題

  • 緩存穿透:指查詢一個(gè)不存在的數(shù)據(jù),由于緩存中沒(méi)有晴埂,每次請(qǐng)求都會(huì)直接請(qǐng)求數(shù)據(jù)庫(kù)究反,導(dǎo)致數(shù)據(jù)庫(kù)壓力過(guò)大,甚至宕機(jī)儒洛。
  • 緩存擊穿:指某個(gè)熱點(diǎn)key失效或過(guò)期精耐,此時(shí)大量請(qǐng)求會(huì)同時(shí)涌入數(shù)據(jù)庫(kù),導(dǎo)致數(shù)據(jù)庫(kù)壓力過(guò)大琅锻,甚至宕機(jī)卦停。
  • 緩存雪崩:指緩存中大量的key在同一時(shí)間過(guò)期,導(dǎo)致請(qǐng)求全部落到了數(shù)據(jù)庫(kù)上恼蓬,造成數(shù)據(jù)庫(kù)壓力過(guò)大沫浆,甚至宕機(jī)。
  • 緩存數(shù)據(jù)一致性:在分布式環(huán)境下滚秩,不同節(jié)點(diǎn)的緩存數(shù)據(jù)不一致,可能導(dǎo)致業(yè)務(wù)異常淮捆。
  • 緩存并發(fā)競(jìng)爭(zhēng):在高并發(fā)場(chǎng)景下郁油,由于多個(gè)線程同時(shí)請(qǐng)求緩存數(shù)據(jù)本股,可能導(dǎo)致緩存穿透和緩存擊穿問(wèn)題。

針對(duì)上述問(wèn)題桐腌,常見(jiàn)的解決方案包括:

  • 使用布隆過(guò)濾器等技術(shù)解決緩存穿透問(wèn)題拄显。
  • 使用分布式鎖、熱點(diǎn)緩存預(yù)熱等技術(shù)解決緩存擊穿問(wèn)題案站。
  • 對(duì)緩存過(guò)期時(shí)間進(jìn)行隨機(jī)化躬审、增加緩存容錯(cuò)等技術(shù)解決緩存雪崩問(wèn)題。
  • 使用緩存更新策略蟆盐,如緩存失效時(shí)異步更新緩存等技術(shù)解決緩存數(shù)據(jù)一致性問(wèn)題承边。
  • 使用本地緩存或緩存預(yù)熱等技術(shù)解決緩存并發(fā)競(jìng)爭(zhēng)問(wèn)題。

4.1 布隆過(guò)濾器解決緩存穿透

布隆過(guò)濾器(Bloom Filter)是一種空間效率很高的概率型數(shù)據(jù)結(jié)構(gòu)石挂,用于判斷某個(gè)元素是否屬于一個(gè)集合博助,其最大的優(yōu)勢(shì)在于可以判斷出某個(gè)元素肯定不存在于集合中,因此可以用于緩存穿透的解決痹愚。

具體來(lái)說(shuō)富岳,我們可以在緩存中存儲(chǔ)一個(gè)布隆過(guò)濾器,用于判斷請(qǐng)求的 key 是否存在于緩存中拯腮。如果布隆過(guò)濾器判斷 key 不存在于緩存中窖式,我們就可以直接返回空結(jié)果,而不需要查詢數(shù)據(jù)庫(kù)动壤,從而避免了緩存穿透的問(wèn)題萝喘。

下面是一個(gè) Java 代碼示例,演示如何使用 Google Guava 提供的布隆過(guò)濾器來(lái)實(shí)現(xiàn)緩存穿透的處理:

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import java.nio.charset.Charset;

public class BloomFilterCache {

    // 預(yù)期插入元素?cái)?shù)量
    private static final int EXPECTED_INSERTIONS = 1000000; 
    // 期望的誤判率 
    private static final double FPP = 0.001;  

    private static final BloomFilter<CharSequence> bloomFilter = BloomFilter.create(Funnels.        stringFunnel(Charset.defaultCharset()), EXPECTED_INSERTIONS, FPP);

    public static void put(String key) {
        bloomFilter.put(key);
    }

    public static boolean mightContain(String key) {
        return bloomFilter.mightContain(key);
    }
}

在這個(gè)示例中狼电,我們使用 Google Guava 提供的 BloomFilter 類來(lái)創(chuàng)建一個(gè)布隆過(guò)濾器蜒灰,用于存儲(chǔ)字符串類型的數(shù)據(jù)。在實(shí)際應(yīng)用中肩碟,我們可以將這個(gè)布隆過(guò)濾器存儲(chǔ)在緩存中强窖,用于判斷請(qǐng)求的 key 是否存在于緩存中。

當(dāng)我們需要往緩存中存儲(chǔ)數(shù)據(jù)時(shí)削祈,我們可以調(diào)用 put 方法將數(shù)據(jù)的 key 添加到布隆過(guò)濾器中翅溺。當(dāng)有請(qǐng)求需要查詢緩存中的數(shù)據(jù)時(shí),我們可以調(diào)用 mightContain 方法來(lái)判斷請(qǐng)求的 key 是否存在于布隆過(guò)濾器中髓抑。如果布隆過(guò)濾器判斷 key 不存在咙崎,我們就可以直接返回空結(jié)果,避免了緩存穿透的問(wèn)題吨拍。

4.2 使用分布式鎖解決緩存擊穿問(wèn)題

使用分布式鎖解決緩存擊穿問(wèn)題的原理是在緩存失效的同時(shí)褪猛,使用分布式鎖來(lái)保證只有一個(gè)線程去訪問(wèn)數(shù)據(jù)庫(kù),其他線程等待該線程的結(jié)果羹饰,并從緩存中獲取數(shù)據(jù)伊滋。

在實(shí)現(xiàn)過(guò)程中碳却,可以使用Redis的setnx(SET if Not eXists)命令來(lái)實(shí)現(xiàn)分布式鎖,其原理是利用Redis的單線程特性笑旺,在設(shè)置鍵時(shí)昼浦,只有一個(gè)客戶端能夠成功地獲取到鎖。

以下是Java示例代碼

public Object getData(String key) {
    Object value = redisTemplate.opsForValue().get(key);
    if (value == null) {
        // 使用分布式鎖筒主,保證只有一個(gè)線程能夠訪問(wèn)數(shù)據(jù)庫(kù)
        String lockKey = "lock:" + key;
        String requestId = UUID.randomUUID().toString();
        boolean lock = redisTemplate.opsForValue().setIfAbsent(lockKey, requestId, 5, TimeUnit.SECONDS);
        if (lock) {
            // 獲取到鎖关噪,從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù),并將數(shù)據(jù)保存到緩存中
            value = getDataFromDatabase(key);
            redisTemplate.opsForValue().set(key, value, 10, TimeUnit.MINUTES);
            // 釋放鎖
            String lockedRequestId = redisTemplate.opsForValue().get(lockKey);
            if (requestId.equals(lockedRequestId)) {
                redisTemplate.delete(lockKey);
            }
        } else {
            // 沒(méi)有獲取到鎖乌妙,等待其他線程獲取數(shù)據(jù)并返回結(jié)果
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            getData(key);
        }
    }
    return value;
}

private Object getDataFromDatabase(String key) {
    // 從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)
    return null;
}

在上述代碼中使兔,首先從緩存中獲取數(shù)據(jù),如果緩存中沒(méi)有數(shù)據(jù)冠胯,則使用分布式鎖來(lái)保證只有一個(gè)線程能夠訪問(wèn)數(shù)據(jù)庫(kù)火诸。如果獲取到鎖,則從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)荠察,并將數(shù)據(jù)保存到緩存中置蜀;如果沒(méi)有獲取到鎖,則等待其他線程獲取數(shù)據(jù)并返回結(jié)果悉盆。最后盯荤,釋放鎖。

4.3 緩存雪崩的具體解決方案

方案一:緩存過(guò)期時(shí)間隨機(jī)化

通常情況下焕盟,緩存過(guò)期時(shí)間都是固定的秋秤,比如10分鐘或30分鐘,這樣容易導(dǎo)致緩存同時(shí)失效脚翘,引發(fā)緩存雪崩灼卢。因此,我們可以考慮將緩存過(guò)期時(shí)間進(jìn)行隨機(jī)化来农,使得不同的緩存具有不同的過(guò)期時(shí)間鞋真,這樣可以分散緩存失效的時(shí)間點(diǎn),減少緩存雪崩的概率沃于。

示例代碼:

// 生成隨機(jī)過(guò)期時(shí)間涩咖,范圍為10分鐘到30分鐘之間
int expireTime = 10 * 60 + new Random().nextInt(20 * 60);
// 設(shè)置緩存,并指定過(guò)期時(shí)間
cache.put(key, value, expireTime, TimeUnit.SECONDS);

方案二:多級(jí)緩存

將緩存分為多個(gè)層級(jí)繁莹,緩存層級(jí)越高的緩存數(shù)據(jù)過(guò)期時(shí)間越長(zhǎng)檩互,容錯(cuò)能力越強(qiáng)。比如可以將緩存分為2個(gè)層級(jí):本地緩存咨演、分布式緩存闸昨,其中本地緩存使用Guava Cache等本地緩存框架,過(guò)期時(shí)間比較短,分布式緩存使用Redis等分布式緩存框架饵较,過(guò)期時(shí)間比本地緩存長(zhǎng)溉跃。

代碼示例:

public class MultiLevelCache<K, V> {

    private final Cache<K, V> localCache;
    private final Cache<K, V> redisCache;
    private final RedisTemplate<K, V> redisTemplate;
    private final String redisKeyPrefix;

    public MultiLevelCache(Cache<K, V> localCache, Cache<K, V> redisCache, RedisTemplate<K, V> redisTemplate, String redisKeyPrefix) {
        this.localCache = localCache;
        this.redisCache = redisCache;
        this.redisTemplate = redisTemplate;
        this.redisKeyPrefix = redisKeyPrefix;
    }

    public V get(K key) {
        V value = localCache.getIfPresent(key);
        if (value != null) {
            return value;
        }
        value = redisCache.getIfPresent(key);
        if (value != null) {
            localCache.put(key, value);
            return value;
        }
        value = redisTemplate.opsForValue().get(getRedisKey(key));
        if (value != null) {
            localCache.put(key, value);
            redisCache.put(key, value);
        }
        return value;
    }

    public void put(K key, V value) {
        localCache.put(key, value);
        redisTemplate.opsForValue().set(getRedisKey(key), value);
    }

    public void invalidate(K key) {
        localCache.invalidate(key);
        redisTemplate.delete(getRedisKey(key));
    }

    private K getRedisKey(K key) {
        return (K) (redisKeyPrefix + ":" + key.toString());
    }
}

方案三:使用限流器

使用限流器(Rate Limiter)來(lái)控制并發(fā)量,避免瞬間大量請(qǐng)求同時(shí)訪問(wèn)緩存造成雪崩效應(yīng)告抄。限流器可以控制單位時(shí)間內(nèi)的請(qǐng)求次數(shù)或并發(fā)量,確保系統(tǒng)在高并發(fā)情況下能夠保持穩(wěn)定嵌牺,不會(huì)因?yàn)樗矔r(shí)高并發(fā)而導(dǎo)致系統(tǒng)崩潰打洼。

限流器的實(shí)現(xiàn)方式可以使用令牌桶算法或漏桶算法等。在Java中逆粹,Guava庫(kù)和Spring Cloud框架都提供了限流器的實(shí)現(xiàn)募疮。

以下是Guava庫(kù)中使用令牌桶算法實(shí)現(xiàn)限流器的示例代碼:

RateLimiter rateLimiter = RateLimiter.create(10); // 每秒最多處理10個(gè)請(qǐng)求
if (rateLimiter.tryAcquire()) {
    // 處理緩存請(qǐng)求
} else {
    // 返回限流提示
}

在以上代碼中,RateLimiter.create(10)表示每秒最多處理10個(gè)請(qǐng)求僻弹,rateLimiter.tryAcquire()嘗試獲取令牌阿浓,如果獲取成功,則處理緩存請(qǐng)求蹋绽;如果獲取失敗芭毙,則返回限流提示。通過(guò)控制每秒處理的請(qǐng)求數(shù)卸耘,可以有效地避免系統(tǒng)因瞬時(shí)高并發(fā)而導(dǎo)致的緩存雪崩問(wèn)題退敦。

除了上述方法外,還可以使用多級(jí)緩存蚣抗、緩存預(yù)熱侈百、動(dòng)態(tài)擴(kuò)容緩存等技術(shù)來(lái)解決緩存雪崩問(wèn)題。在設(shè)計(jì)分布式緩存系統(tǒng)時(shí)翰铡,應(yīng)根據(jù)實(shí)際情況選擇合適的技術(shù)和方案钝域,以確保系統(tǒng)的穩(wěn)定性和可靠性。

4.4 分布式緩存一致性問(wèn)題解決的具體步驟

緩存數(shù)據(jù)一致性問(wèn)題通常有兩個(gè)方面:緩存數(shù)據(jù)的更新和緩存數(shù)據(jù)的失效锭魔。以下是解決緩存數(shù)據(jù)一致性問(wèn)題的一些具體步驟:

  • 單點(diǎn)更新緩存數(shù)據(jù)

單點(diǎn)更新緩存數(shù)據(jù)指的是在數(shù)據(jù)更新時(shí)例证,通過(guò)某個(gè)單獨(dú)的節(jié)點(diǎn)來(lái)更新緩存數(shù)據(jù)。這種方式雖然簡(jiǎn)單赂毯,但是存在單點(diǎn)故障和性能瓶頸的問(wèn)題战虏。

  • 更新數(shù)據(jù)庫(kù)時(shí)同時(shí)更新緩存數(shù)據(jù)

更新數(shù)據(jù)庫(kù)時(shí)同時(shí)更新緩存數(shù)據(jù)是常見(jiàn)的解決方案。這種方式能夠保證數(shù)據(jù)的一致性党涕,但是也會(huì)帶來(lái)一定的性能開(kāi)銷烦感。

  • 延遲失效

延遲失效指的是在緩存數(shù)據(jù)過(guò)期之前,更新緩存數(shù)據(jù)膛堤,保證緩存中的數(shù)據(jù)一直有效手趣。這種方式能夠提高性能,但是可能會(huì)出現(xiàn)數(shù)據(jù)不一致的問(wèn)題。

  • 主動(dòng)失效

主動(dòng)失效指的是在數(shù)據(jù)更新時(shí)绿渣,主動(dòng)將緩存中的數(shù)據(jù)失效朝群,使得下次請(qǐng)求時(shí),可以從數(shù)據(jù)庫(kù)中獲取最新的數(shù)據(jù)中符。這種方式可以保證數(shù)據(jù)的一致性姜胖,但是會(huì)帶來(lái)性能開(kāi)銷。

綜合來(lái)說(shuō)淀散,解決緩存數(shù)據(jù)一致性問(wèn)題的具體步驟要根據(jù)具體的業(yè)務(wù)場(chǎng)景來(lái)確定右莱,需要在保證數(shù)據(jù)一致性的前提下,盡可能地提高系統(tǒng)的性能和可用性档插。

三慢蜓、常用中間件

  • Redis:Redis是目前國(guó)內(nèi)外最流行的分布式緩存中間件,支持多種數(shù)據(jù)類型和豐富的功能郭膛,如發(fā)布訂閱晨抡、Lua腳本、事務(wù)则剃、持久化等耘柱。
  • Memcached:Memcached是最早的分布式緩存中間件之一,主要支持key-value緩存忍级,具有高性能和可擴(kuò)展性帆谍。
  • Tair:Tair是阿里巴巴自主研發(fā)的分布式緩存中間件,具有高性能轴咱、高可用汛蝙、高擴(kuò)展性等特點(diǎn),支持多種數(shù)據(jù)結(jié)構(gòu)和應(yīng)用場(chǎng)景朴肺。
  • Pika:Pika是快手開(kāi)源的一款分布式緩存中間件窖剑,具有高性能、高可用戈稿、易擴(kuò)展等特點(diǎn)西土,支持Redis協(xié)議。
  • Ctrip Tcache:Tcache是攜程開(kāi)源的一款分布式緩存中間件鞍盗,具有高性能需了、高可用、易擴(kuò)展等特點(diǎn)般甲,支持多種數(shù)據(jù)結(jié)構(gòu)和應(yīng)用場(chǎng)景肋乍。
  • QCache:QCache是去哪兒網(wǎng)開(kāi)源的一款分布式緩存中間件,基于Redis實(shí)現(xiàn)敷存,具有高性能墓造、高可用、易擴(kuò)展等特點(diǎn)。
  • XMemcached:XMemcached是一款高性能的Java分布式緩存中間件觅闽,支持Memcached和Ketama兩種哈希算法帝雇。

1、Redis

1.1 簡(jiǎn)介

Redis(Remote Dictionary Server)是一個(gè)開(kāi)源的內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)系統(tǒng)蛉拙,它可以用作數(shù)據(jù)庫(kù)尸闸、緩存和消息中間件。Redis具有內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)孕锄、數(shù)據(jù)持久化室叉、分布式高可用、發(fā)布訂閱硫惕、事務(wù)、Lua腳本等功能野来。它支持多種數(shù)據(jù)結(jié)構(gòu)恼除,包括字符串、哈希表曼氛、列表豁辉、集合、有序集合等舀患,并且支持多種持久化方式徽级,包括RDB快照和AOF日志。Redis的特點(diǎn)是速度快聊浅,操作簡(jiǎn)單易用餐抢,支持復(fù)雜數(shù)據(jù)結(jié)構(gòu)和高并發(fā),是一個(gè)非常受歡迎的開(kāi)源緩存和存儲(chǔ)解決方案低匙。

Redis的優(yōu)點(diǎn):

  • 高性能:Redis是基于內(nèi)存的數(shù)據(jù)存儲(chǔ)旷痕,讀寫(xiě)速度快,單個(gè)Redis實(shí)例可以處理超過(guò)100k個(gè)QPS顽冶。
  • 數(shù)據(jù)類型多樣:Redis支持多種數(shù)據(jù)類型欺抗,如字符串、哈希强重、列表绞呈、集合和有序集合等。
  • 持久化支持:Redis支持持久化存儲(chǔ)數(shù)據(jù)间景,可以將數(shù)據(jù)寫(xiě)入磁盤(pán)中佃声,即使服務(wù)器崩潰也可以恢復(fù)數(shù)據(jù)。
  • 分布式支持:Redis支持分布式架構(gòu)拱燃,可以將數(shù)據(jù)分布到多個(gè)節(jié)點(diǎn)上秉溉,提高性能和可擴(kuò)展性。
  • Lua腳本支持:Redis支持使用Lua腳本執(zhí)行復(fù)雜的操作。
  • 主從復(fù)制:Redis支持主從復(fù)制召嘶,可以將寫(xiě)操作集中在主節(jié)點(diǎn)父晶,讀操作分散到從節(jié)點(diǎn),提高性能和可用性弄跌。
  • 高可用:Redis支持哨兵和集群模式甲喝,實(shí)現(xiàn)高可用和負(fù)載均衡。

Redis的缺點(diǎn):

  • 單機(jī)容量有限:Redis是基于內(nèi)存的铛只,單機(jī)容量有限制埠胖,無(wú)法存儲(chǔ)大量數(shù)據(jù)。
  • 持久化性能較低:Redis的持久化操作會(huì)影響性能淳玩。
  • 數(shù)據(jù)一致性問(wèn)題:Redis在分布式模式下直撤,需要考慮數(shù)據(jù)一致性的問(wèn)題。
  • 不支持ACID事務(wù):Redis不支持ACID事務(wù)蜕着,雖然可以使用Lua腳本實(shí)現(xiàn)原子性操作谋竖,但是在多個(gè)命令之間的一致性無(wú)法保證。
  • 內(nèi)存管理問(wèn)題:Redis需要管理內(nèi)存承匣,如果使用不當(dāng)會(huì)導(dǎo)致內(nèi)存泄漏等問(wèn)題蓖乘。

1.2 官網(wǎng)

https://redis.io

1.3 主要特性

  • 內(nèi)存存儲(chǔ):Redis將所有數(shù)據(jù)存儲(chǔ)在內(nèi)存中,讀寫(xiě)速度非橙推快嘉抒。
  • 持久化:Redis可以將數(shù)據(jù)持久化到磁盤(pán)中,保證數(shù)據(jù)的可靠性袍暴。
  • 數(shù)據(jù)結(jié)構(gòu)豐富:Redis支持多種數(shù)據(jù)結(jié)構(gòu)些侍,如字符串、列表政模、哈希表娩梨、集合、有序集合等览徒。
  • 高并發(fā)狈定、高可用:Redis支持主從復(fù)制和哨兵模式,可以保證高可用和數(shù)據(jù)一致性习蓬。
  • 事務(wù)支持:Redis支持事務(wù)纽什,可以批量執(zhí)行多個(gè)命令。
  • Lua腳本支持:Redis支持使用Lua腳本來(lái)擴(kuò)展其功能躲叼。
  • 發(fā)布/訂閱機(jī)制:Redis支持發(fā)布/訂閱機(jī)制芦缰,可以實(shí)現(xiàn)消息的訂閱和推送。

2枫慷、Memcached

2.1 簡(jiǎn)介

Memcached是一個(gè)免費(fèi)的開(kāi)源高性能分布式內(nèi)存對(duì)象緩存系統(tǒng)让蕾,它可以用于減輕動(dòng)態(tài)數(shù)據(jù)庫(kù)負(fù)載浪规,提高Web應(yīng)用程序的速度、可擴(kuò)展性和可靠性探孝。它最初是由LiveJournal的Brad Fitzpatrick在2003年創(chuàng)建的笋婿。Memcached通過(guò)緩存最常用的數(shù)據(jù)和對(duì)象,減少數(shù)據(jù)庫(kù)訪問(wèn)顿颅,提高應(yīng)用程序的性能和響應(yīng)速度缸濒。它使用了分布式內(nèi)存緩存的方式來(lái)存儲(chǔ)鍵/值對(duì),可以輕松地?cái)U(kuò)展到多臺(tái)服務(wù)器上粱腻,因此成為一個(gè)非常流行的分布式緩存系統(tǒng)庇配。

Memcached 的優(yōu)點(diǎn)包括:

  • 高性能:Memcached 將緩存數(shù)據(jù)存儲(chǔ)在內(nèi)存中,因此讀取速度非成苄快捞慌,可以顯著降低應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)的壓力。
  • 分布式架構(gòu):Memcached 可以通過(guò)分布式架構(gòu)實(shí)現(xiàn)橫向擴(kuò)展柬批,提高系統(tǒng)的可擴(kuò)展性和可用性卿闹。
  • 簡(jiǎn)單易用:Memcached 的 API 簡(jiǎn)單易用,學(xué)習(xí)成本低萝快,支持多種編程語(yǔ)言,易于集成到應(yīng)用程序中著角。

Memcached 的缺點(diǎn)包括:

  • 功能較為簡(jiǎn)單:Memcached 只支持簡(jiǎn)單的鍵值對(duì)存儲(chǔ)揪漩,不支持復(fù)雜數(shù)據(jù)類型和事務(wù)操作等高級(jí)功能。
  • 缺乏安全機(jī)制:Memcached 本身沒(méi)有安全機(jī)制吏口,需要使用第三方插件或自己實(shí)現(xiàn)安全控制奄容。
  • 不支持持久化:Memcached 數(shù)據(jù)存儲(chǔ)在內(nèi)存中,不支持?jǐn)?shù)據(jù)持久化产徊,系統(tǒng)重啟或崩潰后數(shù)據(jù)會(huì)丟失昂勒。

2.2 官網(wǎng)

https://memcached.org

2.3 主要特性

  • 快速的內(nèi)存緩存:Memcached的設(shè)計(jì)目標(biāo)是快速地緩存數(shù)據(jù),它通過(guò)在內(nèi)存中緩存數(shù)據(jù)來(lái)提高數(shù)據(jù)訪問(wèn)的速度舟铜。
  • 分布式架構(gòu):Memcached支持分布式架構(gòu)戈盈,可以在多臺(tái)服務(wù)器上部署,提供更高的可用性和性能谆刨。
  • 簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu):Memcached的數(shù)據(jù)結(jié)構(gòu)非常簡(jiǎn)單塘娶,主要是鍵值對(duì),因此易于使用和管理痊夭。
  • 高并發(fā)性能:Memcached具有很高的并發(fā)性能刁岸,可以支持成千上萬(wàn)的并發(fā)連接。
  • 適應(yīng)于多種編程語(yǔ)言:Memcached可以支持多種編程語(yǔ)言她我,如Java虹曙、Python迫横、PHP等,非常適用于分布式應(yīng)用程序的緩存需求酝碳。
  • 自動(dòng)失效:Memcached會(huì)自動(dòng)失效數(shù)據(jù)矾踱,從而避免了占用過(guò)多的內(nèi)存空間。
  • 可擴(kuò)展性:Memcached可以很容易地?cái)U(kuò)展到更多的節(jié)點(diǎn)击敌,以滿足不斷增長(zhǎng)的應(yīng)用程序需求介返。

最后

推薦使用 Redis 作為 NFT 產(chǎn)品開(kāi)發(fā)中的緩存技術(shù),原因如下:

  • 高性能:Redis 是一種基于內(nèi)存的緩存技術(shù)沃斤,具有極快的讀寫(xiě)速度和低延遲圣蝎,適合處理高并發(fā)和實(shí)時(shí)數(shù)據(jù)請(qǐng)求。

  • 數(shù)據(jù)結(jié)構(gòu)豐富:Redis 支持多種數(shù)據(jù)結(jié)構(gòu)衡瓶,如字符串徘公、哈希、列表哮针、集合关面、有序集合等,可以滿足不同類型的數(shù)據(jù)處理需求十厢。

  • 高可用性:Redis 支持主從復(fù)制和 Sentinel 集群等多種高可用性方案等太,保證系統(tǒng)的可靠性和可用性。

  • 開(kāi)源社區(qū)支持:Redis 擁有活躍的開(kāi)源社區(qū)和豐富的生態(tài)系統(tǒng)

more

  • redis 具體操作相關(guān)內(nèi)容
  • mysql 數(shù)據(jù)庫(kù)分庫(kù)分表技術(shù),MyCat代理及客戶端ShardingJDBC镜廉,及自研分庫(kù)分表相關(guān)內(nèi)容
  • RabbitMQ & Kafka 消息中間件相關(guān)內(nèi)容

文章首發(fā)在老歐的個(gè)人站點(diǎn):老歐的issueList

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贿堰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瞻想,更是在濱河造成了極大的恐慌,老刑警劉巖娩嚼,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蘑险,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡岳悟,警方通過(guò)查閱死者的電腦和手機(jī)佃迄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贵少,“玉大人和屎,你說(shuō)我怎么就攤上這事〈核玻” “怎么了柴信?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宽气。 經(jīng)常有香客問(wèn)我随常,道長(zhǎng)潜沦,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任绪氛,我火速辦了婚禮唆鸡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枣察。我一直安慰自己争占,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布序目。 她就那樣靜靜地躺著臂痕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猿涨。 梳的紋絲不亂的頭發(fā)上握童,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音叛赚,去河邊找鬼澡绩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛俺附,可吹牛的內(nèi)容都是我干的肥卡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼事镣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼步鉴!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蛮浑,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎只嚣,沒(méi)想到半個(gè)月后沮稚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡册舞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年蕴掏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片调鲸。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盛杰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出藐石,到底是詐尸還是另有隱情即供,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布于微,位于F島的核電站逗嫡,受9級(jí)特大地震影響青自,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驱证,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一延窜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抹锄,春花似錦逆瑞、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至车份,卻和暖如春谋减,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扫沼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工出爹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缎除。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓严就,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親器罐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梢为,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容