首页
/
每日頭條
/
圖文
/
本地緩存和分布式緩存同步
本地緩存和分布式緩存同步
更新时间:2024-10-06 05:43:42

本地緩存和分布式緩存同步(十年架構淺談緩存寫法)1

緩存預熱

上次有同學問過,在第一次加載時緩存都為空,怎麼進行預熱。

單機Web情況下一般使用RunTimeCache,這種情況下:

可以在啟動事件裡面刷新

<pre style="margin:0px; padding:0px; white-space:pre-wrap; overflow-wrap:break-word; font-family:" Courier New" !important; font-size:12px !important; ">void Application_Start(object sender,EventArgs e) { //刷新 } </pre>

另外可以單寫個刷新緩存頁面,上線後手動刷新下或發布時自動調用刷新,再或者由用戶自行觸發。

分布式緩存(redis、memcached)情況下:

比如在幾十台服務器緩存時,單刷滿緩存都需要不少一段時間。

這種預熱就複雜一些,有的會單寫個應用程序去跑,也有的會單寫套框架機制去處理(更智能化)。

其目的是在系統上線之前,所有的緩存都預先加載完畢。

多級緩存

計算機結構中CPU和内存之間一般都配有一級緩存、二級緩存來增加交換速度。

這樣當CPU調用大量數據時,就可避開内存直接從CPU緩存中調用,加快讀取速度。

根據CPU緩存得出多級緩存的特點:

1:每一級緩存中儲存的是下一級緩存的一部分。

2:讀取速度按級别依次遞減,成本也依次遞減,容量依次遞增。

3:當前級别未命中時,才會去下一級尋找。

而在企業應用級開發中,使用多級緩存是同樣的目的及設計,隻是粒度更粗,更靈活。

根據速度依次排列lv1-lv6的緩存類型圖:

本地緩存和分布式緩存同步(十年架構淺談緩存寫法)2

3級緩存的命中流程圖例子:

本地緩存和分布式緩存同步(十年架構淺談緩存寫法)3

線程緩存

Web應用是天生的多線程開發,對于一些公共資源必須考慮線程安全,為止不得不通過鎖來保證數據的完整性和正确性。

在實際當中一台web服務器至少也得處理成百上千的請求,想一想在業務複雜的處理流程,函數每調用一次都得鎖一下,對服務器也是個不小的浪費。

而通過線程緩存,可以讓當前處理用戶請求的線程隻拿自己需要的數據。

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: " Courier New" !important; font-size: 12px !important;" > public static ThreadLocal<UserScore> localUserInfo = new ThreadLocal<UserScore>(); </pre>

借助Net提供的線程本地變量,可以在請求入口去拉取當前用戶的數據。

在之後線程整個生命周期裡面,業務邏輯可以毫無顧慮的使用這些數據,而不需要考慮線程安全。

因為不用重新拿新緩存數據,所以也不用擔心數據撕裂的問題。

其當前線程周期裡面的數據是完整無誤的,隻有用戶第二次發起請求才會重新去拿新數據。

這樣就能提高不少服務器吞吐量,注意要在線程的出口處銷毀數據。

内存緩存

無論是遠程數據庫讀取,還是緩存服務器讀取。避免不了要跨進程,跨網絡通信,有的還跨機房。

而應用程序頻繁讀寫,對Web、DB服務器都是個不小的消耗,速度相較内存也慢的多。

代碼上加鎖、異步,甚至加服務器在内,都不是一個很好的辦法。因為加載速度,對用戶體驗非常重要。


所以在有要求的項目中使用本地内存做二級緩存,是非常有必要的。目的就是1:抗并發,2:加快讀取速度。

有個著名的緩存五分鐘法則法則,就是說如果一個數據頻繁被訪問,那麼就應該放内存中。

舉個例子: 有100并發過來,加鎖會導緻前端99線程等候,這個99線程等候着,其實是一直在消耗Web服務器資源。不加就是緩存雪崩。

如果每分鐘拉取一份緩存,緩存到内存,這樣99線程等候時間極大縮短。

文件緩存

相對于内存,硬盤容量大,速度相較于走網絡還更快。

所以我們完全可以把一些不經常變更,放在内存又比較浪費的數據緩存到本地硬盤。

比如使用sqlite一些文件數據庫,我們很容易做到。

分布式緩存

基于内存緩存的redis、memcached等。

基于文件nosql的Casssandra、mongodb等。

redis、memcached是主流的分布式内存緩存,也是應用和DB中間最大的緩存層。

nosql這類的其實不單單隻是做緩存用了,完全用在一些非核心業務的DB層了。

DB緩存

這一層DB主要是緩存由原始數據計算出的結果,從而避免由Web程序通過SQL或在使用中直接計算。

當然也可以把計算好的數據,存儲到redis中當緩存。

本地緩存和分布式緩存同步(十年架構淺談緩存寫法)4

多層緩存

多層緩存概念在很多地方都用到過:

1:上面介紹的多級緩存就是一種,把内容根據讀取頻率,分不同的等級、不同的層次進行存儲,頻率越高離查詢越近。

2:還一種多層是緩存索引的做法,類似B樹查找,這樣能提高檢索效率。

3:從架構上來說浏覽器緩存、CDN緩存、反向代理緩存、服務端緩存、也是多層緩存。

總結

在使用上大家根據實際場景,進行各種組合搭配。本篇談的比較理論些,有些内容細節沒展開。

比如分布式緩存的使用,緩存置換策略及算法,緩存過期機制等。


筆者語錄

針對于上面所涉及到的知識點我總結出了有1到5年開發經驗的程序員在面試中涉及到的絕大部分架構面試題及答案做成了文檔和架構視頻資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發等架構技術資料),希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習,也可以關注我一下以後會有更多幹貨分享。

資料獲取方式:後台私信“資料”即可

本地緩存和分布式緩存同步(十年架構淺談緩存寫法)5

本地緩存和分布式緩存同步(十年架構淺談緩存寫法)6

本地緩存和分布式緩存同步(十年架構淺談緩存寫法)7

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
農村挖機養雞
農村挖機養雞
他出生在一個小山村,家境貧寒,父親不幸患病,不能幹重活。小夥高一被迫辍學,跟人學起了挖掘機。雖然有剩餘但都要拿給父親看病。這個時候他知道,自己是家裡唯一的頂梁柱,打工不是長遠之計。20歲後的他毅然決定返回農村搞養殖,但是他可不是蠻幹。火雞家...
2024-10-06
蘋果耳機airpodspro安卓能降噪嗎
蘋果耳機airpodspro安卓能降噪嗎
我是安卓、蘋果雙機黨,安卓是生産力,工作、生活全在榮耀V30Pro5G上;蘋果X負責娛樂,刷視頻、偶爾玩遊戲。之前我一直用AirPodsPro耳機,蘋果耳機不管在做工還是交互方面,都确實有其它品牌耳機不可比拟的優勢,但這個交互方面的優勢是有...
2024-10-06
薛平貴為什麼要恨王寶钏
薛平貴為什麼要恨王寶钏
愛情,是存在于每個世道永遠不會落幕的話題,從古至今,無數數不清的浪漫愛情故事一直到現在還被我們所銘記,所謂願得一心人,白首不相離,這種愛情可能是我們每個人都在羨慕和追求者的,但是這種美好的愛情可能并不會流傳千古。殊不知這首詩還有後半句,“聞...
2024-10-06
綠豆糕什麼配方好吃
綠豆糕什麼配方好吃
做法步驟1、将去皮綠豆泡水,兩個小時左右。也可以用有皮的就是要泡的長一點,大概一晚上就差不多脫皮了,但是要注意溫度不要太高,以免豆子發芽。2、将泡好的綠豆控幹水份,放在盤子裡,上鍋蒸,上汽後15分鐘。蒸熟後,用勺子碾成面,也可以用料理機,我...
2024-10-06
人之初性本善講的是什麼道理
人之初性本善講的是什麼道理
不要要求你的孩子完美無瑕很多事情都不是你聽到的那樣也不是你看到的那樣不要信口開河害人害己。如果被瘋狗咬了隻傷了皮毛就算了吧得饒人處且饒人但如果讓你流血流淚記得反擊拿石頭砸它砸暈别人不願意對你說的事情就不要問了尊重别人不說的權利也是尊重你自己...
2024-10-06
Copyright 2023-2024 - www.tftnews.com All Rights Reserved