自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

緩存架構(gòu):如何減少不必要的計算?

存儲 存儲軟件
互聯(lián)網(wǎng)應(yīng)用的主要挑戰(zhàn)就是在高并發(fā)情況下,大量的用戶請求到達(dá)應(yīng)用系統(tǒng)服務(wù)器,造成了巨大的計算壓力。

 互聯(lián)網(wǎng)應(yīng)用的主要挑戰(zhàn)就是在高并發(fā)情況下,大量的用戶請求到達(dá)應(yīng)用系統(tǒng)服務(wù)器,造成了巨大的計算壓力?;ヂ?lián)網(wǎng)應(yīng)用的核心解決思路就是采用分布式架構(gòu),提供更多的服務(wù)器,從而提供更多的計算資源,以應(yīng)對高并發(fā)帶來的計算壓力及資源消耗。

[[333222]]

那么有沒有辦法減少到達(dá)服務(wù)器的并發(fā)請求壓力呢?或者請求到達(dá)服務(wù)器后,有沒有辦法減少不必要的計算,降低服務(wù)器的計算資源消耗,盡快返回計算結(jié)果給用戶呢?

有,解決的核心就是緩存。

所謂緩存,就是將需要多次讀取的數(shù)據(jù)暫存起來,這樣在后面,應(yīng)用程序需要多次讀取的時候,就不必從數(shù)據(jù)源重復(fù)加載數(shù)據(jù)了,這樣就可以降低數(shù)據(jù)源的計算負(fù)載壓力,提高數(shù)據(jù)響應(yīng)速度。

一般說來,緩存可以分成兩種,通讀緩存和旁路緩存。

通讀(read-through)緩存,應(yīng)用程序訪問通讀緩存獲取數(shù)據(jù)的時候,如果通讀緩存有應(yīng)用程序需要的數(shù)據(jù),那么就返回這個數(shù)據(jù);如果沒有,那么通讀緩存就自己負(fù)責(zé)訪問數(shù)據(jù)源,從數(shù)據(jù)源獲取數(shù)據(jù)返回給應(yīng)用程序,并將這個數(shù)據(jù)緩存在自己的緩存中。這樣,下次應(yīng)用程序需要數(shù)據(jù)的時候,就可以通過通讀緩存直接獲得數(shù)據(jù)了。

通讀緩存在架構(gòu)中的位置與作用如下圖:

 

緩存架構(gòu):如何減少不必要的計算?

 

旁路(cache-aside)緩存,應(yīng)用程序訪問旁路緩存獲取數(shù)據(jù)的時候,如果旁路緩存中有應(yīng)用程序需要的數(shù)據(jù),那么就返回這個數(shù)據(jù);如果沒有,就返回空(null)。應(yīng)用程序需要自己從數(shù)據(jù)源讀取數(shù)據(jù),然后將這個數(shù)據(jù)寫入到旁路緩存中。這樣,下次應(yīng)用程序需要數(shù)據(jù)的時候,就可以通過旁路緩存直接獲得數(shù)據(jù)了。

旁路緩存在架構(gòu)中位置與作用如下圖:

 

緩存架構(gòu):如何減少不必要的計算?

 

通讀緩存

互聯(lián)網(wǎng)應(yīng)用中主要使用的通讀緩存是 CDN 和反向代理緩存。

CDN(Content Delivery Network)即內(nèi)容分發(fā)網(wǎng)絡(luò)。我們上網(wǎng)的時候,App 或者瀏覽器想要連接到互聯(lián)網(wǎng)應(yīng)用的服務(wù)器,需要網(wǎng)絡(luò)服務(wù)商,比如移動、電信這樣的服務(wù)商為我們提供網(wǎng)絡(luò)服務(wù),建立網(wǎng)絡(luò)連接才可以上網(wǎng)。

而這些服務(wù)商需要在全國范圍內(nèi)部署骨干網(wǎng)絡(luò)、交換機(jī)機(jī)房才能完成網(wǎng)絡(luò)連接服務(wù),這些交換機(jī)機(jī)房可能會離用戶非常近,那么互聯(lián)網(wǎng)應(yīng)用能不能在這些交換機(jī)機(jī)房中部署緩存緩存服務(wù)器呢?這樣,用戶就可以近距離獲得自己需要的數(shù)據(jù),既提高了響應(yīng)速度,又節(jié)約了網(wǎng)絡(luò)帶寬和服務(wù)器資源。

當(dāng)然可以。這個部署在網(wǎng)絡(luò)服務(wù)商機(jī)房中的緩存就是 CDN,因為距離用戶非常近,又被稱作網(wǎng)絡(luò)連接的第一跳。目前很多互聯(lián)網(wǎng)應(yīng)用大約 80% 以上的網(wǎng)絡(luò)流量都是通過 CDN 返回的。

 

緩存架構(gòu):如何減少不必要的計算?

 

CDN 只能緩存靜態(tài)數(shù)據(jù)內(nèi)容,比如圖片、CSS、JS、HTML 等內(nèi)容。而動態(tài)的內(nèi)容,比如訂單查詢、商品搜索結(jié)果等必須要應(yīng)用服務(wù)器進(jìn)行計算處理后才能獲得。因此,互聯(lián)網(wǎng)應(yīng)用的靜態(tài)內(nèi)容和動態(tài)內(nèi)容需要進(jìn)行分離,靜態(tài)內(nèi)容和動態(tài)內(nèi)容部署在不同的服務(wù)器集群上,使用不同的二級域名,即所謂的動靜分離,一方面便于運(yùn)維管理,另一方面也便于 CDN 進(jìn)行緩存,使 CDN 只緩存靜態(tài)內(nèi)容。

反向代理緩存也是一種通讀緩存。我們上網(wǎng)的時候,有時候需要通過代理上網(wǎng),這個代理是代理我們的客戶端上網(wǎng)設(shè)備。而反向代理則代理服務(wù)器,是應(yīng)用程序服務(wù)器的門戶,所有的網(wǎng)絡(luò)請求都需要通過反向代理才能到達(dá)應(yīng)用程序服務(wù)器。既然所有的請求都需要通過反向代理才能到達(dá)應(yīng)用服務(wù)器,那么在這里加一個緩存,盡快將數(shù)據(jù)返回給用戶,而不是發(fā)送給應(yīng)用服務(wù)器,這就是反向代理緩存。

 

緩存架構(gòu):如何減少不必要的計算?

 

用戶請求到達(dá)反向代理緩存服務(wù)器,反向代理檢查本地是否有需要的數(shù)據(jù),如果有就直接返回,如果沒有,就請求應(yīng)用服務(wù)器,得到需要的數(shù)據(jù)后緩存在本地,然后返回給用戶。

旁路緩存

CDN 和反向代理緩存通常會作為系統(tǒng)架構(gòu)的一部分,很多時候?qū)?yīng)用程序是透明的。而應(yīng)用程序在代碼中主要使用的是對象緩存,對象緩存是一種旁路緩存。

不管是通讀緩存還是旁路緩存,緩存通常都是以

對于

程序中使用的對象緩存,可以分成兩種。一種是本地緩存,緩存和應(yīng)用程序在同一個進(jìn)程中啟動,使用程序的堆空間存放緩存數(shù)據(jù)。本地緩存的響應(yīng)速度快,但是緩存可以使用的內(nèi)存空間相對比較小,但是對于大型互聯(lián)網(wǎng)應(yīng)用所需要緩存的數(shù)據(jù)通以 T 計,這時候就要使用遠(yuǎn)程的分布式緩存了。

分布式緩存是指將一組服務(wù)器構(gòu)成一個緩存集群,共同對外提供緩存服務(wù),那么應(yīng)用程序在每次讀寫緩存的時候,如何知道要訪問緩存集群中的哪臺服務(wù)器呢?我們以 Memcached為例,看看分布式緩存的架構(gòu):

 

緩存架構(gòu):如何減少不必要的計算?

 

Memcached 將多臺服務(wù)器構(gòu)成一個緩存集群,緩存數(shù)據(jù)存儲在每臺服務(wù)器的內(nèi)存中。事實上,使用緩存的應(yīng)用程序服務(wù)器通常也是以集群方式部署的,每個程序需要依賴一個Memcached 的客戶端 SDK,通過 SDK 的 API 訪問 Memcached 的服務(wù)器。

應(yīng)用程序調(diào)用 API,API 調(diào)用 SDK 的路由算法,路由算法根據(jù)緩存的 key 值,計算這個key 應(yīng)該訪問哪臺 Memcached 服務(wù)器,計算得到服務(wù)器的 IP 地址和端口號后,API 再調(diào)用 SDK 的通信模塊,將

那么,路由算法又是如何計算得到 Memcached 的服務(wù)器 IP 端口呢?比較簡單的一種方法,和 Hash 算法一樣,利用 key 的 Hash 值對服務(wù)器列表長度取模,根據(jù)余數(shù)就可以確定服務(wù)器列表的下標(biāo),進(jìn)而得到服務(wù)器的 IP 和端口。

緩存注意事項

使用緩存可以減少不必要的計算,能夠帶來三個方面的好處:

  1. 緩存的數(shù)據(jù)通常存儲在內(nèi)存中,距離使用數(shù)據(jù)的應(yīng)用也更近一點,因此相比從硬盤上獲取,或者從遠(yuǎn)程網(wǎng)絡(luò)上獲取,它獲取數(shù)據(jù)的速度更快一點,響應(yīng)時間更快,性能表現(xiàn)更好。
  2. 緩存的數(shù)據(jù)通常是計算結(jié)果數(shù)據(jù),比如對象緩存中,通常存放經(jīng)過計算加工的結(jié)果對象,如果緩存不命中,那么就需要從數(shù)據(jù)庫中獲取原始數(shù)據(jù),然后進(jìn)行計算加工才能得到結(jié)果對象,因此使用緩存可以減少 CPU 的計算消耗,節(jié)省計算資源,同樣也加快了處理的速度。
  3. 通過對象緩存獲取數(shù)據(jù),可以降低數(shù)據(jù)庫的負(fù)載壓力;通過 CDN、反向代理等通讀緩存獲取數(shù)據(jù),可以降低服務(wù)器的負(fù)載壓力。這些被釋放出來的計算資源,可以提供給其他更有需要的計算場景,比如寫數(shù)據(jù)的場景,間接提高整個系統(tǒng)的處理能力。

但是緩存也不是萬能的,如果不恰當(dāng)?shù)厥褂镁彺?,也可能會帶來問題。

首先就是數(shù)據(jù)臟讀的問題,緩存的數(shù)據(jù)來自數(shù)據(jù)源,如果數(shù)據(jù)源中的數(shù)據(jù)被修改了,那么緩存中的數(shù)據(jù)就變成臟數(shù)據(jù)了。

主要解決辦法有兩個,一個是過期失效,每次寫入緩存中的數(shù)據(jù)都標(biāo)記其失效時間,在讀取緩存的時候,檢查數(shù)據(jù)是否已經(jīng)過期失效,如果失效,就重新從數(shù)據(jù)源獲取數(shù)據(jù)。緩存失效依然可能會在未失效時間內(nèi)讀到臟數(shù)據(jù),但是一般的應(yīng)用都可以容忍較短時間的數(shù)據(jù)不一致,比如淘寶賣家更新了商品信息,那么幾分鐘數(shù)據(jù)沒有更新到緩存,買家看到的還是舊數(shù)據(jù),這種情況通常是可以接受的,這時候,就可以設(shè)置緩存失效時間為幾分鐘。

另一個辦法就是失效通知,應(yīng)用程序更新數(shù)據(jù)源的數(shù)據(jù),同時發(fā)送通知,將該數(shù)據(jù)從緩存中清除。失效通知看起來數(shù)據(jù)更新更加及時,但是實踐中,更多使用的還是過期失效。

此外,并不是所有數(shù)據(jù)使用緩存都有意義。在互聯(lián)網(wǎng)應(yīng)用中,大多數(shù)數(shù)據(jù)訪問都是有熱點的,比如熱門微博會被更多閱讀,熱門商品會被更多瀏覽。那么將這些熱門的數(shù)據(jù)保存在緩存中是有意義的,因為緩存通常使用內(nèi)存,存儲空間比較有限,只能存儲有限的數(shù)據(jù),熱門數(shù)據(jù)存儲在緩存中,可以被更多次地讀取,緩存效率也比較高。

相反,如果緩存的數(shù)據(jù)沒有熱點,寫入緩存的數(shù)據(jù)很難被重復(fù)讀取,那么使用緩存就不是很有必要了。

總結(jié)

緩存是優(yōu)化軟件性能的殺手锏,任何需要查詢數(shù)據(jù)、請求數(shù)據(jù)的場合都可以考慮使用緩存。緩存幾乎是無處不在的,程序代碼中可以使用緩存,網(wǎng)絡(luò)架構(gòu)中可以使用緩存,CPU、操作系統(tǒng)、虛擬機(jī)也大量使用緩存,事實上,緩存最早就是在 CPU 中使用的。對于一個典型的互聯(lián)網(wǎng)應(yīng)用而言,使用緩存可以解決絕大部分的性能問題,如果需要優(yōu)化軟件性能,那么可以優(yōu)先考慮哪里可以使用緩存改善性能。

除了本文提到的系統(tǒng)架構(gòu)緩存外,客戶端也可以使用緩存,在 App 或者瀏覽器中緩存數(shù)據(jù),甚至都不需要消耗網(wǎng)絡(luò)帶寬資源,也不會消耗 CDN、反向代理的內(nèi)存資源,更不會消耗服務(wù)器的計算資源。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2018-08-24 11:52:15

成本公共云云服務(wù)

2023-05-04 07:06:25

微軟Windows

2011-02-18 11:02:28

2011-04-18 14:35:53

2017-06-26 09:55:31

前端后端開發(fā)

2011-04-18 14:27:50

2015-11-25 13:37:52

磁盤空間LinuxUbuntu

2024-01-05 07:41:08

Go語言語句

2011-08-18 09:51:21

2020-12-18 10:01:11

GitHub開源Cookies

2011-08-18 09:46:01

2011-08-10 11:12:03

2010-05-21 14:09:41

2016-08-18 15:54:08

云存儲云計算

2016-08-05 16:13:50

Android性能優(yōu)化對象

2010-05-20 17:36:09

IIS安全

2021-02-10 15:54:48

Windows 10Windows微軟

2009-11-26 09:52:05

jQuery選擇器

2024-10-28 08:00:00

微服務(wù)架構(gòu)開發(fā)

2009-10-22 09:25:54

Linux系統(tǒng)服務(wù)操作系統(tǒng)
點贊
收藏

51CTO技術(shù)棧公眾號