2012-07-02 40 views
1

我想在任何給定的時間獲得「活」密鑰的數量。現在根據API文檔getItemCount()是爲了返回這個。Memcache getItemCount()計算過期的密鑰?

但事實並非如此。過期的密鑰不會減少getItemCount()的值。爲什麼是這樣?我如何準確計算所有尚未過期的「活動」或「活着」密鑰?

這是我的put代碼; syncCache.put(uid,cachedUID,Expiration.byDeltaSeconds(3),SetPolicy.SET_ALWAYS);

現在應該在3秒後過期。它會使它們過期,但getItemCount()不反映鍵的真實數量。

更新: 看來memcache可能不是我應該使用的,所以這裏是我正在嘗試做的。

我希望編寫一個適用於桌面應用程序的「用戶在線」功能的Google-app引擎服務器/應用程序。桌面應用程序嚮應用程序發出一個具有唯一ID的http請求作爲參數。該應用程序將此UID與時間戳一起存儲。這是每3分鐘一次。

每隔5分鐘,任何時間戳超出5分鐘窗口的條目都將被刪除。然後你計算你有多少條目,這就是有多少用戶「在線」。

過期的功能看起來很完美,因此我甚至不需要擔心時間戳或清除過期的條目。

+0

getItemCount在將項目放入緩存之前立即顯示什麼?該項目是否肯定被添加? –

+0

getItemCount增量很好,並且在創建新密鑰時正確顯示。但是,如果我理解正確,密鑰過期時它應該遞減? – JasonF

回答

0

這可能是一個在文檔中的問題,蟒蛇沒有提及任何關於活着的東西。這在Python中也是可重現的。

另請參閱此相關文章How does the lazy expiration mechanism in memcached operate?

+0

您鏈接的相關帖子表明我擔心的是,過期的密鑰實際上並未被銷燬。 這並不好。在任何時候,我可以確定有多少活着的鑰匙? – JasonF

+0

已過期的密鑰已銷燬,但僅在需要時才銷燬。例如,如果您嘗試訪問過期的元素,則會將其刪除。另外,如果memcache需要更多內存來存儲新密鑰,它將首先刪除已過期的密鑰。如果你向我們介紹你想達到什麼,也許會更好。 –

+0

我剛剛更新了原始文章,以包括我想要完成的內容。我開始認爲memcache可能不是解決方案。 – JasonF

0

getItemCount()可能會返回過期的密鑰,因爲它是memcache的工作方式和許多其他緩存。

Memcache可以幫助您完成您所描述的內容,但不會像您嘗試這樣做。考慮完全相反的情況:您將在線用戶放入memcache中,然後由於缺少可用內存,appengine會將其從memcache中清除。緩存不會給你任何擔保,你的物品將被存儲在任何特定的時期。因此memcache可以讓您減少對數據存儲和延遲的請求數量。

其中一個方法來做到這一點: 維護有序映射(用戶ID,最後登錄,刷新),其存儲在數據存儲的條目(或內存緩存中,如果你不需要它非常精確)。在每次登錄/刷新時,都會根據特定密鑰更新值以及定期執行cron-job將舊用戶從地圖中刪除。因此,地圖的大小將是在特定時刻登錄使用的數量。

確保地圖適合1Mb,這對於memcache或數據存儲都是有限制的。