memcache面試題匯總


1,memcached是原子的嗎? 

所有的被發送到memcached的單個命令是完全原子的。如果您針對同一份數據同時發送了一個set命令和一個get命令,它們不會影響對方。它們將被串行化、先后執行。即使在多線程模式,所有的命令都是原子的,除非程序有bug:) 命令序列不是原子的。如果您通過get命令獲取了一個item,修改了它,然后想把它set回memcached,我們不保證這個item沒有被其他進程(process,未必是操作系統中的進程)操作過。在並發的情況下,您也可能覆寫了一個被其他進程set的item。 
memcached 1.2.5以及更高版本,提供了gets和cas命令,它們可以解決上面的問題。如果您使用gets命令查詢某個key的item,memcached會給您返回該item當前值的唯一標識。如果您覆寫了這個item並想把它寫回到memcached中,您可以通過cas命令把那個唯一標識一起發送給 memcached。如果該item存放在memcached中的唯一標識與您提供的一致,您的寫操作將會成功。如果另一個進程在這期間也修改了這個 item,那么該item存放在memcached中的唯一標識將會改變,您的寫操作就會失敗。 
通常,基於memcached中item的值來修改item,是一件棘手的事情。除非您很清楚自己在做什么,否則請不要做這樣的事情。 

2,memcached的內存分配器是如何工作的?為什么不適用malloc/free?為何要使用slabs? 

實際上,這是一個編譯時選項。默認會使用內部的slab分配器。您確實確實應該使用內建的slab分配器。最早的時候,memcached只使用 malloc/free來管理內存。然而,這種方式不能與OS的內存管理以前很好地工作。反復地malloc/free造成了內存碎片,OS最終花費大量的時間去查找連續的內存塊來滿足malloc的請求,而不是運行memcached進程。如果您不同意,當然可以使用malloc!只是不要在郵件列表中抱怨啊:) 
slab分配器就是為了解決這個問題而生的。內存被分配並划分成chunks,一直被重復使用。因為內存被划分成大小不等的slabs,如果item 的大小與被選擇存放它的slab不是很合適的話,就會浪費一些內存。Steven Grimm正在這方面已經做出了有效的改進。
郵件列表中有一些關於slab的改進(power of n 還是 power of 2)和權衡方案:http://lists.danga.com/pipermail/memcached/2006-May/002163.htmlhttp://lists.danga.com/pipermail/memcached/2007-March/003753.html 。 
如果您想使用malloc/free,看看它們工作地怎么樣,您可以在構建過程中定義USE_SYSTEM_MALLOC。這個特性沒有經過很好的測試,所以太不可能得到開發者的支持。 

3,某人在set存儲memecache數據時候,將 $expire 設置為100天,發現設置的key總是獲取不到值?

memcache默認過期時間是30天,過期時間用秒為單位或時間戳為單位,前一種情況秒數不能超過60×60×24×30(30天時間的秒數);如果失效的值大於這個值, 服務端會將其作為一個真實的Unix時間戳來處理而不是自當前時間的偏移。如果過期時間設定為0,表示永不過期,但也不是相對的,有可能因為服務端為了給其他新的元素分配空間而被LRU算法刪除。

4,memcache的addServer的故障轉移機制

$mem_conf = array(
    array('host'=>'192.168.0.11', 'port'=>'11211'),
    array('host'=>'192.168.0.12', 'port'=>'11211'),
    array('host'=>'192.168.0.13', 'port'=>'11211')
);
 
$memcache = new Memcache ( );
foreach ( $mem_conf as $v ) {
    $memcache->addServer ( $v ['host'], $v ['port'] );
}

  使用$memcache->addServer 而不是 $memcache->connect 去連接 Memcached 服務器,是因為當 Memcache 客戶端使用 addServer 服務器池時,是根據“crc32(key) % current_server_num”哈希算法將 key 哈希到不同的服務器的,PHP、C 和 python 的客戶端都是如此的算法。

Memcache 客戶端的 addserver 具有故障轉移機制,當 addserver 了2台 Memcached 服務器,而其中1台宕機了,那么 current_server_num 會由原先的2變成1。(2011-10-11個人測試的時候發現無法實現此功能,第二台Memcached不可用的時候,會造成正常要保存到這台server的數據會丟失的現象)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM