MemCache知識集錦

2021-07-11 21:05:10 字數 3209 閱讀 5874

1.memcache定義:是乙個自由、原始碼開放、高效能、分布式的分布式記憶體物件快取系統,用於動態web應用,以減輕資料庫的負載。其通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提高**訪問的速度。其是儲存鍵值對的hashmap,在記憶體中對任意資料使用k-v儲存,資料可**於資料庫呼叫、api呼叫、頁面渲染結果。

2.memcache功能概括:快速部署,易於開發,能解決面對大規模資料快取的許多難題。

3.memcache與memcached的區別:

前者是專案名稱,後者是前者伺服器端可執行檔案的名稱。

4.memcache訪問模型:阿里技術專家李智慧型老師-《大型**技術架構 核心原理與案例分析》memcache部分

特別強調:memcache被稱為"分布式快取",但其本身完全不具備分布式功能,memcache集群之間不會相互通訊(與之對比,jboss cache某台伺服器有快取資料更新,會通知集群中其他機器更新快取或清除快取資料),所謂的"分布式",完全依賴於客戶端程式的實現,如圖所示:

5.基於上圖,梳理memcache一次寫快取的流程

1、應用程式輸入需要寫快取的資料

2、api將key輸入路由演算法模組,路由演算法根據key和memcache集群伺服器列表得到一台伺服器編號

3、由伺服器編號得到memcache及其ip位址和埠號

4、api呼叫通訊模組和指定編號的伺服器通訊,將資料寫入該伺服器,完成一次分布式快取的寫操作

5、讀快取和寫快取一樣,使用相同的路由演算法和伺服器列表,應用程式只要查詢的是相同的key,memcache就能保證快取命中。

6.原理:這種memcache集群的方式也是從分割槽容錯性的方面考慮的,加入node2宕機,node2上儲存的資料都不可用了,由於集群中node1和node2還存在,下次請求node2中儲存的key值時,肯定沒有命中,這時會先從資料庫中拿到要快取的資料,然後路由演算法模組根據key值在node0和node1中選取乙個節點,把對應的資料放進去,這樣下次訪問就可以走快取了。

7.以上表明對伺服器集群的管理,路由演算法至關重要,就和負載均衡一樣,路由演算法決定著該訪問集群中的哪台伺服器。

8.例項》簡單路由演算法:

1、>>餘數hash演算法:string str 對應hashcode是50、伺服器數目3 取餘數是1 則str對應節點node1 路由演算法把str路由到node1伺服器上。 保證快取資料在整個伺服器集群中有比較均衡的分布。(不考慮伺服器集群伸縮性,餘數hash演算法幾乎滿足絕大多數快取路由需求,但是當分布式快取集群需要擴容的時候就比較難辦了):當大部分被快取的資料因為伺服器擴容而不能正確讀取時,資料訪問的壓力就落在資料庫的身上了,這將大大超過資料庫的負載能力,嚴重的可能導致資料庫宕機。

2、>>一致性hash演算法:假設長度為232的整數環(一致性hash環),根據節點名稱的hash值(分布為[0,232-1])將快取伺服器節點分配在該環上,對快取的資料key值進行hash演算法,然後按環的順時針查詢距離該key最近的伺服器節點,完成key到伺服器的對映查詢(如圖所示)。

如果增加一台伺服器節點(如圖所示),則影響乙個key的值(本來在node1,新加乙個節點到了最近的node4),因此採用一致性hash演算法也會影響整個集群,但只是影響加粗的那一段而已,相比餘數hash演算法,這個影響小的多,更有其特質:隨著集群規模的增大,繼續命中原有快取資料的概率會越來越小,雖有少數不能被讀到,但是這個比例足夠小,即使訪問資料庫也不會造成致命的負載壓力。

9.memcache實現原理:

memcache資料存放在記憶體中幾點情況說明:

<1>訪問資料速度比傳統的關係型資料庫要快(傳統關係型資料庫為了保持資料的永續性,資料存放在硬碟中,io操作慢)。

<2>memcache資料存放在記憶體中意味著只要被重啟了,資料就會消失。

<3>memcache資料存放在記憶體中勢必受到機器位數的限制。

因此,memcache將記憶體空間分為一組slab,每個slab有若干個page,每個page預設是1m(如:乙個slab占用100m記憶體的話,那麼這個slab下應該有100個page)

每個page裡包含一組chunk(真正存放資料的地方),同乙個slab裡的chunk大小是固定的,有相同大小chunk的slab被組織在一起,成為slab_class。

memcache記憶體分配的方式稱為allocator,slab的數量是有限的,和啟動引數的配置有關。

針對memcache的記憶體分配及**演算法總結三點:

1.memcache記憶體分配chunk裡面會有記憶體浪費,88位元組的value分配在128位元組的chunk中,就損失了30位元組,同時也避免了管理記憶體碎片的問題。

2.memcache的lru演算法不是針對全域性的,是針對slab的。

3.乙個新資料過來,slab會先以page為單申請一塊記憶體,申請的記憶體最多只有1m,所以value大小自然不能大於1m。

10.總結memcache特性與限制:

<1>memcache中可儲存到item資料沒有上限,記憶體足夠就行。

<2>memcache單程序在32位機中最大使用記憶體為2g,64位機則沒有限制。

<3>key最大為250位元組,超過該長度無法儲存。

<4>單個item最大資料是1mb,超過1mb的資料不予儲存。

<5>memcache服務端是不安全的,比如已知某個memcache節點,可以直接telnet過去,並通過flush_all讓已經存在的鍵值對立即失效。

<6>不能夠遍歷memcache中所有的item,該速度相對緩慢容易阻礙其他操作。

<7>memcache高效能源自兩階段雜湊結構:一階段在客戶端,通過hash演算法根據key值算出乙個節點;二階段在服務端,通過乙個內部的hash演算法,查詢真正的item並返回  給客戶端,從實現的角度看,memcache是乙個非阻塞的、基於事件的伺服器程式。

<8>memcache設定新增某乙個key值,傳入expiry為0表示這個key值永久有效,失效時間為30天,開發者無法改變。

matlab知識集錦

灰度影象擊中與擊不中運算 影象灰度拉伸的作用 灰度拉伸又叫對比度拉伸,它是最基本的一種灰度變換,使用的是最簡單的分段線性變換函式,它的主要思想是提高影象處理時灰度級的動態範圍。它可以有選擇的拉伸某段灰度區間以改善輸出影象。如圖,所示的變換函式的運算結果是將原圖在a到b之間的灰度拉伸到c到d之間。如果...

matlab知識集錦

matlab中的inv函式是什麼意思 inv是求逆矩陣。x 是矩陣轉置 對複數矩陣而言是共軛轉置 matlab rgb2gray 函式是基於什麼原理編寫的,或者這個函式的 以r g b為軸建立空間直角座標系,則rgb圖的每個象素的顏色可以用該三維空間的乙個點來表示,而gray圖的每個象素的顏色可以用...

前端知識集錦

目前自己組建的乙個團隊正在寫乙份面試圖譜,將會在七月中旬開源。內容十分豐富,第一版會開源前端方面知識和程式設計師必備知識,後期會逐步寫入後端方面知識。因為工程所涉及內容太多 目前已經寫了乙個半月 並且還需翻譯成英文,所以所需時間較長。有興趣的同學可以 follow 我的 github 得到最快的更新...