為什么要使用memcache?

大家好,我是IT修真院深圳分院第03期學員,一枚正直純潔善良的程序員。今天給大家分享一下,修真院官網JAVA(職業)任務6的深度思考:

為什么要使用memcache?

背景介紹

1.為什么要使用緩存?

在大多數Web應用都將數據保存到關系型數據庫中,WWW服務器從中讀取數據并在瀏覽器中顯示。但隨著數據量的增大、訪問的集中,就會出現關系型數據的負擔加重、數據庫響應緩慢、網站打開延遲等問題。

通過在內存中緩存數據庫的查詢結果,減少數據訪問次數,以提高動態Web應用的速度,提高網站架構的并發能力和可擴展性。

2.memcache是什么?為什么需要memcache(它的作用)?

使用memcache之前,每個服務器的緩存是分開的,總的容量等于單個服務器的緩存容量,還要分出精力去維護所有服務器上緩存的數據,讓它們保存一致,如下圖。


使用memcache前

使用memcache之后:把每一個使用了緩存的服務器稱作節點,memcache則是把這些節點組成一個節點池。 1.容量增大,總的容量是所有服務器緩存容量的總和。2.一個指定的數據的將在同一個節點上進行讀寫,不需要保持節點間的數據一致,如下圖。


使用memcache后

知識剖析

1.memcache到底是什么?

MemCache是一個自由、源碼開放、高性能、分布式的分布式內存對象緩存系統,用于動態Web應用以減輕數據庫的負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高了網站訪問的速度。MemCaChe是一個存儲鍵值對的HashMap,在內存中對任意的數據(比如字符串、對象等)所使用的key-value存儲。

2.memcache的訪問模型


memcache訪問模型

看圖說話

1.可以在同一個服務器上分出多個端口作為一個memcached節點

2.圖中分為應用程序服務器和memcache服務器,也就是說,我們可以專門準備一個服務器,不裝應用程序,只作為memcache服務器使用。

3.理一下MemCache一次寫緩存的過程

service方法里傳入需要寫緩存的數據并規定key==》

客戶端將key傳到內部的路由算法模塊==》

得到key對應HashCode==》

路由算法根據Key和Memcache幾圈服務器列表得到一臺服務器編號==》

由服務器編號得到MemCache的IP地址和端口號==》

客戶端調用通信模塊和指定編號的服務器通信,將數據寫入該服務器。

4.MemCache的一次讀緩存的過程

讀緩存跟寫緩存的步驟差不多。


路由算法

1、余數Hash算法

原理:假設key對應的HashCode是50,memcache服務器數目為3,取余數2,那么這個key對應節點node2。

優點:算法簡單,能滿足絕大多數的緩存路由需求。

缺點:擴容會導致get命中率大幅度下降。

下圖中,紅色字體表示get命中

擴容前后對比

2.一致性Hash算法

原理:先構造一個長度為232的證書換(這個環被稱為一致性Hash環),根據節點名稱的Hash值(值的分布范圍為[0,232-1])把MemCache服務器節點放在這個Hsah環上,接著根據需要緩存的數據的Key對應的Hash值(值的分布范圍也是[0,232-1]),然后在Hash環上順時針查找距離這Key的Hash值最近的服務器節點,完成一次寫操作。

優點:擴容方便,get命中率下降的不是很厲害。而且,節點數越多,每次擴容后get命中率下降越小。也就是說,你不用熬夜加班擴容、預熱緩存。也就是說,你沒有加班費了。

擴容前


擴容后


Memcache實現原理

首先要理解下面的一些概念:

1)MemCache的數據是存放在內存中的;

2)這里面涉及4個概念:slab_class,slab,page,chunk

3)MemCache將內存分為一組slab,每個slab下又有若干個page,每個page大小都是固定的1M;

4)每個page里面包含一組chunk,chunk是真正存放數據的地方,同一個slab里面的chunk大小是固定的;

5)有相同大小chunk的slb被組織在一起,被稱為slab_class。


MemCache中的value過來存放的地方是由value的大小決定的,value總是會被存放到與chunk大小最接近的一個slab中,比如slab[1]的chunk大小為80字節、slab[2]的chunk大小為100字節、slab[3]的chunk大小為128字節(相鄰slab內的chunk基本以1.25為比例進行增長,MemCache啟動時可以用-f指定這個比例),那么過來一個88字節的value,這個value將被放到2號slab中。放slab的時候,首先slab要申請內存,申請內存是以page為單位的,所以在放入第一個數據的時候,無論大小為多少,都會有1M大小的page被分配給該slab。申請到page后,slab會將這個page的內存按chunk的大小進行切分,這樣就變成了一個chunk數組,最后從這個chunk數組中選擇一個用于存儲數據。

Memcache常用命令

1.安裝命令

memcache依賴于libevent,要先安裝libevent才能安裝memcache

2.啟動命令

3.查看命令

stats ? ? ? ?? ?????返回MemCache通用統計信息

stats items ? ? ?返回哥哥slab中item的數目和最老的item的年齡(最后一次訪問舉例現在的秒數)

statsslabs ? ? ? 返回MemCache運行期間創建的每個slab的信息


常見問題

1.memcache和memcached的區別?

memcache是項目的名稱,memcached是memcache服務器端可執行文件的名稱。


2.memcache無可用連接?

解決思路:

確認服務器上的memcached服務有沒有打開==》服務器用telnet看能不能連上memcached

本地用telnet連接服務器的memcached

重啟服務器


為什么使用memcache?_騰訊視頻


PPT戳這里

今天的分享就到這里啦,歡迎大家點贊、轉發、留言、拍磚~

技能樹.IT修真院

“我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,掌控自己學習的節奏,學習的路上不再迷茫”。

這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導。快來與我一起學習吧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容