簡體   English   中英

強制立即使用Memcache中的項目

[英]Force immediate availability of item in Memcache

使用Google App Engine NDB,內存緩存的大多數方面都會自動處理。 但是,在讀取至少一次之前,該項目在Memcache中不可用。 因此,必須首先使用get讀取該項目,然后memcache將其存儲。 Put()從內存緩存中將其刪除。

但是,我需要立即在memcache中提供一些可用的東西。 我是Memcache的新手,所以我不完全確定一切在幕后如何工作,但是有兩種方法可以做到這一點:

  1. 在實體的put()之后,立即執行get(),以使其在內存緩存中可用。
  2. 在put()之后,立即在內存緩存中手動設置該項。 這是有道理的,但是我不確定這種方法是否存在任何問題。 如果我在Memcache中手動設置某些內容,這是否會干擾NDB的其他自動Memcache處理? 另外 ,在手動設置Memcache中的某些內容時,我應該使用什么鍵,這樣一經獲取,自動Memcache處理程序便知道要查找什么?

我懷疑您是指此:

Memcache不支持事務。 因此,僅適用於數據存儲和內存緩存的更新可能只適用於兩者之一。 為了在這種情況下保持一致性(可能以性能為代價),已更新的實體將從內存緩存中刪除,然后寫入到數據存儲中。 隨后的讀取操作將發現內存緩存中缺少的實體,從數據存儲中檢索它,然后作為讀取的副作用在內存緩存中對其進行更新。 此外,NDB讀取內部事務時會忽略Memcache。

因此,如果您需要放置一些可用的東西,則必須自己將其緩存在內存緩存中。

這使我們進入2)

如果您在Memcache AFAIK中手動設置某些內容,它將不會以任何方式與NDB的自動緩存交互。 同樣,您不能使用自動版本可以自動使用的密鑰來設置手動內存緩存條目。

您只需要在您顯式控制的內容周圍構建一層Memcache。 每次執行放置操作時,都會使用一個函數,該函數先將數據存儲到數據存儲中,然后再放入內存緩存中,從而在需要時使現有條目無效。 同樣,對於get,您可以先嘗試使用memcache,然后再回到數據存儲區。 聽起來幾乎就像NDB正在為您做的事情!

也許看一下策略功能選項以進行更好的控制: https : //developers.google.com/appengine/docs/python/ndb/cache#policy_functions

但是,請不要忘記上下文緩存可能已經在做您想做的事情:

上下文緩存僅在單個傳入HTTP請求期間保持不變,並且僅對處理該請求的代碼“可見”。 它很快; 此緩存位於內存中。 當NDB函數寫入數據存儲時,它還將寫入上下文緩存中。 當NDB函數讀取實體時,它將首先檢查上下文緩存。 如果在此處找到該實體,則不會發生數據存儲交互。

查詢不會在任何緩存中查找值。 但是,如果緩存策略如此說明,則查詢結果將寫回到上下文緩存中(但絕不會寫入Memcache)。

因此,如果在同一請求中發生put和后續get,無論如何它都會從上下文緩存中出來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM