2013-02-08 37 views
0

我有一個奇怪的問題。在一個任務我從數據庫中提取數據,並將其寫入到異步內存緩存:除了寫入Memcache的1MB還有其他限制嗎?

ke = database.Events.query(database.Events.eventid.IN(eventslist)) 
eventskeys = ke.fetch(len(eventslist),keys_only = True) 

data = ndb.get_multi(eventskeys) 

eventsdic = {} 

for event in data: 
    eventsdic.update({event.eventid: event.participants}) 

client = memcache.Client() 

rpc = memcache.create_rpc()  
response = client.set_multi_async(eventsdic, time=3600, rpc=rpc) 

的事件列表中有20個項目。我這樣做約500個項目分散在隊列中的不同任務。

我沒有收到任何錯誤。但是我注意到,在第一次嘗試之後,500個事件中的大約300個確實存在於內存緩存中。如果我只對事件進行了2-3次重試,這些事件現在還不在memcache中,但在一段時間後,我有100%的memcache。

但我真的不明白,爲什麼它不適用於第一次嘗試?

回答

0

這可能是因爲memcache「監視」您的數據。經常使用的物品不太可能被驅逐。這是(據我瞭解)不是簡單的FIFO型系統

對我來說這不是一個「問題」,因此,如果我將某些東西放入內存緩存中,那麼當我稍後請求時,它就不存在了。我將使用我放入的回退機制來應對這種情況。你根本不能假設任何東西將會在memcache中,當你要求它。

https://developers.google.com/appengine/articles/scaling/memcache

代價是內存緩存中保存的數據是短暫的,作爲系統運行的內存緩存空間被驅逐。在極少數情況下,所有memcached數據都可以一次性清除。

+0

謝謝 - 但是數據在被寫入memcache之後幾秒鐘就被驅逐了?這個任務已經是我的後備,恢復了我發現不存在的memcache數據。 – 2013-02-08 12:59:15

+0

我想它可以,如果你加入*加載*的內容,它會驅逐它的一部分,如果它的空間不足。事實是,它確實有點不透明。嘗試做一些測試,而不是500與50試試 - 看看它是否在那之後。即便如此,無論你發現,我想可能會隨着資源轉移而發生變化。 – 2013-02-08 13:01:42

+0

另請注意,它從未被提及*給定應用程序有多少* memcache可用? – 2013-02-08 13:02:20

相關問題