雜記 快取技術

2021-09-24 00:02:24 字數 3708 閱讀 9478

計算機體系快取

什麼是快取,我們先看看計算機體系結構中的儲存體系,根據馮·諾依曼計算機體系結構模型,計算機分為五大部分:運算器、控制器、儲存器、輸入裝置、輸出裝置。結合現代計算機,cpu包含運算器和控制器兩個部分,cpu負責計算,其需要的資料由儲存提供,儲存分為幾個級別,就拿我當前的pc舉個例子,機器儲存清單如下:

356g的磁碟

4g的記憶體

3mb**快取

256kb二級快取(pre core)

除了上述部分,還有cpu內的暫存器,當然有的計算機還有一級快取等。cpu運算器工作的時候需要資料,資料**來?首先從距離cpu最近的二級快取去拿,這塊快取速度最快,通常也是體積最小,因為**最貴:

儲存金字塔

如上圖所示,儲存體系就像個金子塔,最上層最快,**最貴,最下層最慢,**也最便宜,cpu的資料來源優先順序一層層從上到下去尋找資料。

很顯然,除了最慢的那塊儲存,在計算機體系中,相對較快的那些儲存都可以被稱為快取,他們解決的問題是讓儲存訪問更快。

快取應用系統

計算機體系儲存系統模型擴充套件到應用也是一樣,應用需要資料,資料**來?快取(更快的儲存)->db(較慢的儲存),他們的工作流程大致如下圖所示:

帶快取的儲存訪問一般模型

如上圖所示,快取應用系統一般儲存訪問流程:首先訪問快取較快的儲存介質,如果命中且未失效則返回內容,如果未命中或失效則訪問較慢的儲存介質將內容返回同時更新快取。

memcached是livejournal旗下的danga interactive公司的brad fitzpatric為首開發的一款軟體。現在已經成為mixi、hatena、facebook、vox、livejournal等眾多服務中提高web應用擴充套件性的重要因素。傳統的web應用都將資料儲存到rdbms中,應用伺服器從rdbms中讀取資料、處理資料並在瀏覽器中顯示。但是隨著資料量增大、訪問的集中、就會出現rdbms的負擔加重、資料庫響應變慢、導致整個系統響應延遲增加。

而memcached就是為了解決這個問題而出現的,memcached是一款高效能的分布式記憶體快取伺服器,一般目的是為了通過快取資料庫的查詢命中減少資料庫壓力、提高應用響應速度、提高可擴充套件性。

memcached快取特點

協議簡單

基於libevent的事件處理

內建記憶體儲存方式

memcached不相互通訊的分布式

memcached分布式原理

今天的內容主要涉及memcached特點的第四條,memcached不相互通訊,那麼memcached是如何實現分布式的呢?memcached的分布式實現主要依賴客戶端的實現:

如上圖所示,我們看下快取的儲存的一般流程:

當資料到達客戶端,客戶端實現的演算法就會根據「鍵」來決定儲存的memcached伺服器,伺服器選定後,命令他儲存資料。取的時候也一樣,客戶端根據「鍵」選擇伺服器,使用儲存時候的相同演算法就能保證選中和存的時候相同的伺服器。

餘數計算分散法是memcached標準的memcached分布式方法,演算法如下:

crc($key)%n

該演算法下,客戶端首先根據key來計算crc,然後結果對伺服器數進行取模得到memcached伺服器節點,對於這種方式有兩個問題值得說明一下:

當選擇到的伺服器無法連線的時候,一種解決辦法是將嘗試的連線次數加到key後面,然後重新進行hash,這種做法也叫rehash。

第二個問題也是這種方法的致命的缺點,儘管餘數計算分散發相當簡單,資料分散也很優秀,當新增或者移除伺服器的時候,快取重組的代價相當大。

consistent hashing演算法描述如下:首先求出memcached伺服器節點的雜湊值,並將其分配到02^32的圓上,這個圓我們可以把它叫做值域,然後用同樣的方法求出儲存資料鍵的雜湊值,並對映到圓上。然後從資料對映到的位置開始順時針查詢,將資料儲存到找到的第乙個伺服器上,如果超過02^32仍找不到,就會儲存在第一台memcached伺服器上:

memcachd基本原理

再丟擲上面的問題,如果新新增或移除一台機器,在consistent hashing演算法下會有什麼影響。上圖中假設有四個節點,我們再新增乙個節點叫node5

新增了node節點之後

node5被放在了node4與node2之間,本來對映到node2和node4之間的區域都會找到node4,當有node5的時候,node5和node4之間的還是找到node4,而node5和node2之間的此時會找到node5,因此當新增一台伺服器的時候受影響的僅僅是node5和node2區間。

優化的consistent hashing演算法

上面可以看出使用consistent hashing最大限度的抑制了鍵的重新分配,且有的consistent hashing的實現方式還採用了虛擬節點的思想。問題起源於使用一般hash函式的話,伺服器的對映地點的分布非常不均勻,從而導致資料庫訪問傾斜,大量的key被對映到同一臺伺服器上。為了避免這個問題,引入了虛擬節點的機制,為每台伺服器計算出多個hash值,每個值對應環上的乙個節點位置,這種節點叫虛擬節點。而key的對映方式不變,就是多了層從虛擬節點再對映到物理機的過程。這種優化下儘管物理機很少的情況下,只要虛擬節點足夠多,也能夠使用得key分布的相對均勻。

redis作為乙個高效能的key-value資料庫具有以下特徵:

多樣的資料模型

持久化主從同步

redis支援豐富的資料型別,最為常用的資料型別主要由五種:string、hash、list、set和sorted set。redis通常將資料儲存於記憶體中,或被配置為使用虛擬記憶體。redis有乙個很重要的特點就是它可以實現持久化資料,通過兩種方式可以實現資料持久化:使用rdb快照的方式,將記憶體中的資料不斷寫入磁碟;或使用類似mysql的aof日誌方式,記錄每次更新的日誌。前者效能較高,但是可能會引起一定程度的資料丟失;後者相反。 redis支援將資料同步到多台從資料庫上,這種特性對提高讀取效能非常有益。

2.8以前的版本:與memcached一致,可以在客戶端實現,也可以使用**,twitter已開發出用於redis和memcached的**twemproxy 。

3.0 以後的版本:相較於memcached只能採用客戶端實現分布式儲存,redis則在伺服器端構建分布式儲存。redis cluster是乙個實現了分布式且允許單點故障的redis高階版本,它沒有中心節點,各個節點地位一致,具有線性可伸縮的功能。如圖給出redis cluster的分布式儲存架構,其中節點與節點之間通過二進位制協議進行通訊,節點與客戶端之間通過ascii協議進行通訊。在資料的放置策略上,redis cluster將整個 key的數值域分成16384個雜湊槽,每個節點上可以儲存乙個或多個雜湊槽,也就是說當前redis cluster支援的最大節點數就是16384

技術雜記1

1 ike tls均提供了資料加密的方式,對應ipsec vpn ssl vpn,實際就是對相應通訊流量做資料的完整性 私密性和不可否認性的處理。2 ike 1 4個包,協商提議,產生金鑰,為後續5 6,1 3資料報做認證和加密做準備工作。phase2階段的協商提議 產生金鑰則為感興趣流做認證和加密...

vue技術雜記

以後會慢慢更新 如果你的語句有一條沒有執行,可以在它前面加debugger來除錯 2.想要在子元件中呼叫父元件的方法 如 開啟model彈出框後,關閉重新整理表單資料 在父級中先provide出你要用的函式,再在子元件中inject注入 如 父級 export default goback 子級 返...

ios技術點雜記

category是向已有的類中新增方法,達到類拓展的目的。新新增的方法同樣會被被拓展類的所有子類繼承。語法 inte ce classname categoryname methodname1 methodname2 end implementation classname categoryname...