2013-07-16 100 views
0

你好,我是新來Memcache.I有5個內存緩存服務器(1.22版),我使用Python的memcache library.When我使用一個服務器中的所有工作正常,但是當我使用memc.set_servers(memcL)至配置5個服務器一些密鑰被緩存,而其他密鑰不被緩存。這種奇怪行爲的原因是什麼?Python的內存緩存

代碼摘錄:

 itemsForCache=queries[1].execute(settings.getDBCursor_1(),queries[1].getQuery(settings.getParameters()))  
    cacheDataEntry="" 
    for CacheItems in itemsForCache: 
     cacheDataEntry+=str(CacheItems[0])+" " 

    cache_time = time.time() - start_time 
    cachingTime+=cache_time; 
    li.info(recommendation.getIdRec()+str(iterator[0])+"_"+pKey+" | "+cacheDataEntry+" | "+str(cache_time)) 
    settings.getMemCacheClient().set(recommendation.getIdRec()+str(iterator[0])+"_"+pKey,cacheDataEntry,int(settings.getConfigurationValue("memcache-data-life-time"))) 

謝謝您的幫助。

回答

0

Memcached實際上不是分佈式服務器;這是一個簡單的鍵值存儲。在每臺服務器上運行的每個memcached實例都是獨立運行的,不知道還有其他的memcached服務器。你的軟件給服務器一個密鑰,它會收到一個值;就是這樣。

那麼數據分佈是如何實現的呢?這是客戶端庫。 memcached客戶端庫(即您的程序使用的python內存緩存庫)實際上是將數據分配給您爲其配置的所有服務器之間的數據庫。它的數據分發算法是這樣的,一個給定的密鑰總是會到達同一個memcached服務器。

所以,一些鍵被緩存,其他鍵不是。這可能意味着緩存的密鑰會轉到正在運行的memcached服務器,而未緩存的密鑰會轉到無法訪問的memcached服務器。您應該驗證客戶端設置是否正確,並嘗試從客戶端依次連接到每個服務器,例如,與

nc 192.168.1.18 11211 

其中192.168.1.18是memcached服務器。

還要注意的是,如果你改變了客戶端配置(例如,通過添加服務器),那麼所有的按鍵變化分佈,讓你改變配置可能無法在新配置檢索之前已經緩存某些鍵(因爲他們的服務器已更改),並需要重新緩存。

+0

謝謝你的幫助。最後問題是我設置的緩存密鑰的過期時間大於30天,Memcache不支持超過30天的過期時間。這種情況導致了Memcache的奇怪行爲。 – amartin

0

最後我通過設置關鍵問題解決了到期時間爲0(沒有到期)。將上述參數設置爲大於2592000s(30天)的值時,Memcache有一個奇怪的行爲。

http://php.net/manual/en/memcache.set.php

「的項目的到期時間。如果是等於零,該項目將永遠不會過期,您還可以使用Unix時間戳或一些從當前時間開始秒,但在後者。的情況下秒數不得超過2592000(30天)。「

謝謝你的幫助。