
1 緩存的本質(zhì)
我們常常會講:“加了緩存,我們的系統(tǒng)就會更快” 。所謂的 “更快”,本質(zhì)上做到了如下兩點(diǎn):-
減小 CPU 消耗
將原來需要實(shí)時計算的內(nèi)容提前算好、把一些公用的數(shù)據(jù)進(jìn)行復(fù)用,這可以減少 CPU 消耗,從而提升響應(yīng)性能。
-
減小 I/O 消耗
將原來對網(wǎng)絡(luò)、磁盤等較慢介質(zhì)的讀寫訪問變?yōu)閷?nèi)存等較快介質(zhì)的訪問,從而提升響應(yīng)性能。
2 本地緩存 JDK Map
JDK Map 經(jīng)常用于緩存實(shí)現(xiàn):-
HashMap
HashMap 是一種基于哈希表的集合類,它提供了快速的插入、查找和刪除操作。可以將鍵值對作為緩存項的存儲方式,將鍵作為緩存項的唯一標(biāo)識符,值作為緩存項的內(nèi)容。
-
ConcurrentHashMap
ConcurrentHashMap 是線程安全的 HashMap,它在多線程環(huán)境下可以保證高效的并發(fā)讀寫操作。
-
LinkedHashMap
LinkedHashMap 是一種有序的 HashMap ,它保留了元素插入的順序,可以按照插入順序或者訪問順序進(jìn)行遍歷。
-
TreeMap
TreeMap 是一種基于紅黑樹的有序 Map,它可以按照鍵的順序進(jìn)行遍歷。

-
紅包系統(tǒng)是高并發(fā)應(yīng)用,快速將請求結(jié)果響應(yīng)給前端,大大提升用戶體驗;
-
紅包活動數(shù)量并不多,就算全部放入到 Map 里也不會產(chǎn)生內(nèi)存溢出的問題;
-
定時任務(wù)刷新緩存并不會影響紅包系統(tǒng)的業(yè)務(wù)。
3 本地緩存框架
雖然使用 JDK Map 能快捷構(gòu)建緩存,但緩存的功能還是比較孱弱的。因為現(xiàn)實(shí)場景里,我們可能需要給緩存添加緩存統(tǒng)計、過期失效、淘汰策略等功能。于是,本地緩存框架應(yīng)運(yùn)而生。流行的 Java 緩存框架包括:Ehcache , Google Guava , Caffine Cache 。

4 分布式緩存
分布式緩存是指將緩存數(shù)據(jù)分布在多臺機(jī)器上,以提高緩存容量和并發(fā)讀寫能力的緩存系統(tǒng)。分布式緩存通常由多臺機(jī)器組成一個集群,每臺機(jī)器上都運(yùn)行著相同的緩存服務(wù)進(jìn)程,緩存數(shù)據(jù)被均勻地分布在集群中的各個節(jié)點(diǎn)上。Redis 是分布式緩存的首選,甚至我們一提到緩存,很多后端工程師首先想到的就它。下圖是神州專車訂單的 Redis 集群架構(gòu) 。將 Redis 集群拆分成四個分片,每個分片包含一主一從,主從可以切換。應(yīng)用 A 根據(jù)不同的緩存 key 訪問不同的分片。
-
修改新生代大小,從原來的 2G 修改成 4G,并精簡緩存數(shù)據(jù)大小 (從平均 300k 左右降為 80k 左右);
-
把緩存拆成兩個部分,第一部分是全量數(shù)據(jù),第二部分是增量數(shù)據(jù)(數(shù)據(jù)量很小)。頁面第一次請求拉取全量數(shù)據(jù),當(dāng)比分有變化的時候,通過 websocket 推送增量數(shù)據(jù)。
5 多級緩存
開源中國網(wǎng)站最開始完全是用本地緩存框架 Ehcache 。后來隨著訪問量的激增,出現(xiàn)了一個可怕的問題:“因為 Java 程序更新很頻繁,每次更新的時候都要重啟。一旦重啟后,整個 Ehcache 緩存里的數(shù)據(jù)都被清掉。重啟后若大量訪問進(jìn)來的話,開源中國的數(shù)據(jù)庫基本上很快就會崩掉”。于是,開源中國開發(fā)了多級緩存框架J2Cache,使用了多級緩存Ehcache + Redis。多級緩存有如下優(yōu)勢:-
離用戶越近,速度越快;
-
減少分布式緩存查詢頻率,降低序列化和反序列化的 CPU 消耗;
-
大幅度減少網(wǎng)絡(luò) IO 以及帶寬消耗。


6 沒有銀彈
沒有銀彈是 Fred Brooks 在 1987 年所發(fā)表的一篇關(guān)于軟件工程的經(jīng)典論文。論文強(qiáng)調(diào)真正的銀彈并不存在,而所謂的銀彈則是指沒有任何一項技術(shù)或方法可以能讓軟件工程的生產(chǎn)力在十年內(nèi)提高十倍。通俗來講:在技術(shù)領(lǐng)域中沒有一種通用的解決方案可以解決所有問題。技術(shù)本質(zhì)上是為了解決問題而存在的,每個問題都有其獨(dú)特的環(huán)境和限制條件,沒有一種通用的技術(shù)或工具可以完美地解決所有問題。雖然技術(shù)不斷發(fā)展和進(jìn)步,但是對于復(fù)雜的問題,仍需要結(jié)合多種技術(shù)和方法,進(jìn)行系統(tǒng)性的思考和綜合性的解決方案設(shè)計,才能得到最優(yōu)解決方案。回到文章開頭的問題 ,如何說服技術(shù)老大用 Redis ?假如應(yīng)用就是一個單體應(yīng)用,緩存可以不共享,通過定時任務(wù)刷新緩存對業(yè)務(wù)沒有影響,而且本地內(nèi)存可以 Hold 住緩存的對象大小,那么你的技術(shù)老大的方案沒有問題。假如應(yīng)用業(yè)務(wù)比較復(fù)雜,需要使用緩存提升系統(tǒng)的性能,同時分布式緩存共享的特性對于研發(fā)來講開發(fā)更加快捷,Redis 確實(shí)是個不錯的選擇,可以從研發(fā)成本、代碼維護(hù)、人力模型等多個角度和技術(shù)老大提出自己的觀點(diǎn)。總而言之,在技術(shù)領(lǐng)域中,沒有銀彈。我們需要不斷探索和研究新的技術(shù),但同時也需要認(rèn)識到技術(shù)的局限性,不盲目追求所謂的 “銀彈”,而是結(jié)合具體問題和需求,選擇最適合的解決方案。
-
框架
+關(guān)注
關(guān)注
0文章
404瀏覽量
17744 -
磁盤
+關(guān)注
關(guān)注
1文章
387瀏覽量
25573 -
Redis
+關(guān)注
關(guān)注
0文章
382瀏覽量
11246
發(fā)布評論請先 登錄
如何使用Rust連接Redis
Redis Stream應(yīng)用案例
redis概述
啟動Redis的三種方法
如何使得redis中的數(shù)據(jù)不再有
labview讀寫操作REDIS
什么是 Redis

Redis的主從、哨兵、Redis Cluster集群

Redis 的數(shù)據(jù)清理策略

如何用Springboot整合Redis

Java redis鎖怎么實(shí)現(xiàn)
redis容器內(nèi)怎么查看redis日志
Redis實(shí)戰(zhàn)筆記

評論