一江场、本地緩存框架
本地緩存框架適用于單機(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)
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)
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