Memcached總結

1、Memcached簡介算法

    memcached是高性能的分佈式內存緩存服務器。它經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態Web應用的速度、提升可擴展性。與其相似常見的還有Redis。Memcached基於一個存儲鍵/值(K/V)對的hashmap。客戶端能夠用任何語言來編寫,並經過memcached協議與守護進程通訊。數據庫

    memcached的API使用32位元的循環冗餘校驗(CRC-32)計算鍵值後,將資料分散在不一樣的機器上。當表格滿了之後,接下來新增的資料會以LRU機制替換掉。緩存

2、Memcached的分佈式算法服務器

一、餘數哈希(餘數計算分散):數據結構

原理:根據服務器臺數的餘數進行分散:先求得鍵(key)的整數哈希值( int hashCode ),經過Hash函數把key轉化成整數後,再用這個哈希值除以服務器臺數,根據餘數選擇服務器。多線程

舉例:總共10臺服務器(編號爲0~9),先獲取數據的key的整數哈希值:hashCode=hash(key)=13 ,而後除以服務器總檯數,mod 10(13%10)=3,即選擇編號爲3的服務器進行存儲。分佈式

缺點:當添加或減小服務器後要進行重哈希,這樣會致使原來的服務器序號變了,則可能出現求得的餘數也改變,致使Memcached命中率降低,致使更多地訪問數據庫服務器去調數據,增長了數據庫服務器的負載。memcached

二、一致性哈希:函數

原理:性能

  • 一致性哈希是將整個哈希值空間組織成一個虛擬的圓環,如假設某哈希函數H的值空間是0~(2^32 -1)(即哈希值是一個32位的無符號整型)。這個哈希空間爲環。而後讓每臺機器佔一個扇形空間。(一致性哈希方式,使得服務器保存的哈希值空間是一個範圍,而不是一個特定的餘數系列.因此減小了增刪服務器後的影響.)

  • 哈希空間按順時針方向組織。爲肯定每臺服務器在空間上的位置,按照服務器主機名或者IP地址對每臺服務器進行Hash尋址。而後須要使用hash算法來判斷數據應該存儲在哪一個服務器:首先,將數據根據key值使用相同的函數H計算出哈希值h,根據h肯定數據在環上的位置,今後位置延環順時針向下尋找,遇到的第一個服務器就是其應該存儲的服務器。

容錯性:對下圖,當Server3服務器故障時,數據的存儲指示D發生了改變,存放在了Server2上邊。系統的存儲數據變化最少(由於是數據是順時針尋找服務器存儲,因此D位置數據找到的是Server2服務器)

擴展性:假設增長服務器Server4,按規則放在BC中間,那麼只是B存儲在Server4上邊了,總體的影響只是發生在了新增節點的區間部分。

3、Memcached的數據清除算法

  • Memcached會啓動LRU(Least Recently Used,最近最少使用)算法淘汰舊的數據項。 
  • 每一個slab會維護一個隊列,剛插入的數據在隊頭,常常get的數據也會移動到隊頭,這樣較老或者訪問較少的數據相對都留在隊尾。該算法從隊尾開始淘汰。當slab分配不到足夠的內存時,首先會檢查隊尾是否有過時數據。若是有的話會直接將其覆蓋爲新的對象,若是沒有,會開始淘汰隊尾的對象。

4、工做流程

  • 檢查客戶端的請求數據是否在memcached中,若存在則直接把請求數據返回,不存在則訪問數據庫服務器進行操做;
  • 若是請求的數據不在memcached中,就去查數據庫,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份到memcached中(memcached客戶端不負責,須要程序明確實現);
  • 每次更新數據庫的同時更新memcached中的數據,保證一致性;當分配給memcached內存空間用完以後,會使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效數據首先被替換,而後再替換掉最近未使用的數據。

5、Memcached 和 Redis的區別?

一、數據存儲位置:Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用。而Memecache把數據所有存在內存之中;

二、速度上:Redis的速度比memcached快不少;

三、多線程:Memcached支持多線程,而Redis使用單線程的IO複用模型;

四、支持的數據類型:Memcached僅支持簡單的數據類型,想要存入複雜的數據類型必須把複雜的數據類型轉變成簡單的數據類型。Redis不只僅支持簡單的k/v類型的數據,同時還提供string(字符串)、list(鏈表)、set(集合)、zset(sortedset --有序集合)和hash(哈希類型)等數據結構的存儲。

相關文章
相關標籤/搜索