經驗整理-18-memcached-100-@

memcached是怎麼工作的? 

當查詢數據時,客戶端首先(參考節點列表)計算出入參key的哈希值(階段一哈希),找到對應節點;然後memcached節點通過一個內部的哈希算法(階段二哈希),查找真正的數據(item)。 

舉個列子,假設有3個客戶端1, 2, 3,3臺memcached A, B, C: 
Client 1想把數據”barbaz”以key “foo”存儲。Client 1首先參考節點列表(A, B, C),計算key “foo”的哈希值,假設memcached B被選中。接着,Client 1直接connect到memcached B,通過key “foo”把數據”barbaz”存儲進去。  Client 2使用與Client 1相同的客戶端庫(意味着階段一的哈希算法相同),也擁有同樣的memcached列表(A, B, C)。 
於是,經過相同的哈希計算(階段一),Client 2計算出key “foo”在memcached B上,然後它直接請求memcached B,得到數據”barbaz”。 

各種客戶端在memcached中數據的存儲形式是不同的(perl Storable, php serialize, java hibernate, JSON等)。一些客戶端實現的哈希算法也不一樣。但是,memcached服務器端的行爲總是一致的。 

最後,從實現的角度看,memcached是一個非阻塞的、基於事件的服務器程序。這種架構可以很好地解決C10K problem ,並具有極佳的可擴展性。 

可以參考A Story of Caching ,這篇文章簡單解釋了客戶端與memcached是如何交互的。 


memcached緩存的實現原理? 

緩存策略

當ms的hash表滿了之後,新的插入數據會替代老的數據,更新的策略是LRU(優先刪最近最少使用),以及每個kv對的有效時限

在這裏插入圖片描述


memcached最大的優勢是什麼? 


極佳水平可擴展性,特別是在一個巨大的系統中。由於客戶端自己做了一次哈希,那麼我們很容易增加大量memcached到集羣中。memcached之間沒有相互通信,因此不會增加 memcached的負載;沒有多播協議,不會網絡通信量爆炸(implode)。memcached的集羣很好用。內存不夠了?增加幾臺 memcached吧;CPU不夠用了?再增加幾臺吧;

memcached和服務器的local cache(比如PHP的APC、mmap文件等)相比,有什麼優缺點? 
* local cache面臨着嚴重的內存限制,這一點上面已經提到。 

 


memcached的cache機制是怎樣的? 

Memcached主要的cache機制是LRU(最近最少用)算法+超時失效內存滿了,就優先刪這兩種。
 

memcached如何處理容錯的? 

不處理!:) 在memcached節點失效的情況下,集羣沒有必要做任何容錯處理。如果發生了節點失效,應對的措施完全取決於用戶。節點失效時,下面列出幾種方案供您選擇: 
* 把失效的節點從節點列表中移除。做這個操作千萬要小心!在默認情況下(餘數式哈希算法),客戶端添加或移除節點,會導致所有的緩存數據不可用!因爲哈希參照的節點列表變化了,大部分key會因爲哈希值的改變而被映射到(與原來)不同的節點上。 
* 啓動熱備節點,接管失效節點所佔用的IP。這樣可以防止哈希紊亂(hashing chaos)。 

如何將memcached中item批量導入導出? 

您不應該這樣做!Memcached是一個非阻塞的服務器因爲量大不是單線程,可能導致memcached暫停或瞬時拒絕服務。向 memcached中批量導入數據往往不是您真正想要的!想象看,如果緩存數據在導出導入之間發生了變化,您就需要處理髒數據了;如果緩存數據在導出導入之間過期了,您又怎麼處理這些數據呢? 
但是我確實需要把memcached中的item批量導出導入,怎麼辦?? 
好吧好吧。如果您需要批量導出導入,最可能的原因一般是重新生成緩存數據需要消耗很長的時間,或者數據庫壞了讓您飽受痛苦。 


memcached是如何做身份驗證的? 

沒有身份認證機制!memcached的客戶端和服務器端之所以是輕量級的,部分原因就是完全沒有實現身份驗證機制。這樣,memcached可以很快地創建新連接,服務器端也無需任何配置。 
如果您希望限制訪問,您可以使用防火牆

memcached的多線程是什麼?如何使用它們? 

線程就是定律(threads rule)!在Steven Grimm和Facebook的努力下,memcached 1.2及更高版本擁有了多線程模式。多線程模式允許memcached能夠充分利用多個CPU,並在CPU之間共享所有的緩存數據。memcached使用一種簡單的鎖機制來保證數據更新操作的互斥。相比在同一個物理機器上運行多個memcached實例,這種方式能夠更有效地處理multi gets。 
如果您的系統負載並不重,也許您不需要啓用多線程工作模式。如果您在運行一個擁有大規模硬件的、龐大的網站,您將會看到多線程的好處。 
簡單地總結一下:命令解析(memcached在這裏花了大部分時間)可以運行在多線程模式下。memcached內部對數據的操作是基於很多全局鎖的(因此這部分工作不是多線程的)。未來對多線程模式的改進,將移除大量的全局鎖,提高memcached在負載極高的場景下的性能。 
 

memcached能接受的key的最大長度是多少? memcached對item的過期時間有什麼限制? 


key的最大長度是250個字符。過期時間最大可以達到30天。memcached把傳入的過期時間(時間段)解釋成時間點後,一旦到了這個時間點,memcached就把item置爲失效狀態。這是一個簡單但obscure的機制。 

memcached最大能存儲多大的單個item? 爲什麼單個item的大小被限制在1M byte之內? 

一、答:1MB。如果你的數據大於1MB,可以考慮在客戶端壓縮或拆分到多個key中。 
二、答:簡單的回答:因爲內存分配器的算法就是這樣的。 
詳細的回答:Memcached的內存存儲引擎(引擎將來可插拔…),使用slabs來管理內存。內

memcached是原子的嗎? 

單個命令是完全原子的,但是沒有鎖的概念,併發更新應用是不安全的
 

常用命令需注意點?

  • et與add在key不存在時效果一致,add在key存在時不會成功。

  • set與replace在key存在時效果一致,replace在key不存在不會成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章