快取的收益和成本以及程序快取講解

2021-10-19 07:08:27 字數 2242 閱讀 6665

快取是什麼?

起源於cpu,原始意義是指訪問速度⽐⼀般隨機訪問儲存器(ram)快的⼀種ram,通常它 不像系統主存那樣使⽤dram技術,⽽使⽤昂貴但較快速的sram技術

快取類別

cpu l1/l2/l3 cache、linux page cache加速硬碟讀寫、瀏覽器快取、堆內快取(程序快取)、分布式緩 存

離cpu越近的速度越快

快取觸發條件

1.使用者訪問觸發:使用者第一次進來走資料庫,資料加入快取,第二次進來如果快取沒過期返回。但弊端也暴露出來了,如果使用者恰恰每次訪問都是等過期了才觸發,這樣快取就沒什麼意義了

2.非同步刷快取:使用者訪問讀多寫少的業務場景,不管多少使用者獲取的都是相同資料,比如設定2分鐘重新整理,主動去重新整理快取

但以上方法都有弊端,非同步刷資料,如果你資料太多,但你使用者訪問數都是不確定的,可能今天就100個人訪問,明天可能100萬個人訪問,只是舉例子。所以一切方式都是看場景

快取帶來的回報

高速讀寫:快取加速讀寫速度

降低後端負載:後端伺服器通過前端快取降低負載-業務端使用redis降低後端mysql負載等

快取帶來的代價

資料不一致:快取層和資料層有時視窗不一致,和更新策略有關

**維護成本:原本只需讀寫mysql就能實現功能,但加入了快取之後就要去維護快取的資料,增加**複雜度

堆記憶體可能帶來記憶體溢位的風險影響使用者程序:如ehcache、loadingcache、xmx

堆記憶體一般效能更好,遠端快取需要套接字傳輸

使用者界別快取盡量採用遠端快取

大資料量盡量採用遠端快取,服務節點化原則

也可以叫程序內快取或本地快取,以ehcache、gauvacache為例。沒有網路開銷,節省了內網寬頻,響應延時更低。

程序快取優勢

1.減輕資料儲存伺服器壓力

2.減少與資料儲存伺服器的通訊,提高相應速度

程序快取缺點

1.現在應用多是集群部署,程序快取是在每個節點內,資料儲存多分,一致性難以保障。比如你部署100臺節點,程序快取都是使用者級的,他每次訪問的節點可能都是不一樣的,這樣命中率就會很短,而且資料冗餘且一致性難以保障

2.集群部署下快取分散,管理、同步的成本比較高

分布式快取就不做介紹了,一搜一大堆

至於什麼情況下適合應用程序內快取?

相同的請求或者設定的相同快取key的請求每次都是同乙個伺服器上的同乙個程式去處理,這樣這個請求的快取正常情況下只會產生乙份。 如果每次請求都會路由到不同的伺服器,便會產生多個快取的副本,維護這些快取資料的一致性是需要代價的。

當有新的伺服器節點加入或者伺服器節點退出的時候,不能發生雪崩現象,所有快取請求都穿透到達資料庫,那是比較要命的。

如果快取的處理伺服器發生變化,比如:由於某種原因,開始請求是由伺服器a來處理,後來a伺服器down了,現在由伺服器b來處理,在快取轉移的過程中,必須能保證資料的正確性和一致性。

程式的程序內快取必須有過期策略,在有限記憶體大小的情況下,合理的使用。推薦使用lru淘汰演算法來保證記憶體不會撐爆。

系統的併發量及其大,對效能的要求及其高,可以考慮使用程序內快取。

如果是小部分唯讀資料,並且訪問量比較大,例如經常使用的字典資料等,可以考慮使用程序內快取。

相對於分布式快取,比如redis,程序內快取有哪些優勢?

程序內快取效能比較高,延遲會更小,更節省頻寬,畢竟分布式快取網路呼叫的效能和本地呼叫比起來慢太多,

由於和應用程式位於同一程序,共享相同的虛擬記憶體,所以在狀態維護上更容易一些,

其次程序內的快取不設計到網路傳輸,所以沒有序列化的過程,在效能上更勝一籌。

程序內快取的資料型別幾乎可以是語言級別支援的任意型別,資料型別設計上比大多數分布式快取裝置支援要靈活許多。

個人理解

首先把資料從磁碟載入到記憶體做快取,這個是對的。畢竟磁碟的io速度比記憶體要慢的多。就拿我們現在使用的大多數pc機以及伺服器來說,磁碟往往是效能的瓶頸。

如果有條件或者框架支援可以實現程序內快取,我還是推薦使用程序內快取,畢竟類似redis這樣的kv儲存和應用程式多數情況不在一台伺服器上,雖然區域網的速度肉眼看起來非常快,但是對於cpu來講,還是讓cpu休了乙個大假。

在應對高併發的情況下,如果有適當的環境還是覺得程序內快取為首選,另外一點程式要盡量避免執行緒切換,盡量非同步化。如果可以最好能預估出快取資料的大小,避免記憶體洩漏等現象發生。

當然分布式快取有自己的優勢,在監控,容災,擴充套件性,易用性等方面更勝一籌。至於用程序內還是分布式快取,沒有定論,能解決業務痛點就是最好的結果

Redis 快取的收益和成本

高速讀寫。降低後端負載 後端伺服器通過前端快取降低負載 業務端使用 redis 降低後端 mysql 負載等。資料不一致。快取層和資料層有時間視窗不一致,和更新策略有關。維護成本。原本只需要讀寫 mysql 就能實現功能,但加入了快取之後就要去維護快取的資料,增加了 複雜度。堆內快取可能帶來記憶體溢...

程序的退出方式以及殭屍程序和孤兒程序

1 正常退出 檢查wait和waitpid所返回的終止狀態的巨集巨集 說明wifexited status 若為正常終止子程序返回的狀態,則為真。對於這種情況可執行wexitstatus status 取子程序傳送給exit exit或 exit引數的低8位 wifsignaled status 若...

程序和執行緒的概念以及如何創造執行緒

1 計算機的cpu承擔了所有的任務,他就像一座工廠,時刻在執行。2 cpu一次只能執行乙個任務,我們可以假定工廠的電力有限,一次只能供給乙個車間使用,也就是說乙個車間開工時,其他車間都必須停工。3 程序就好比工廠的車間,它代表著cpu所能處理的單個任務。任一時刻,cpu總是執行乙個程序,其他程序處於...