2009-05-21 97 views
10

這與Google App Engine Memcache API特別相關,但我確定它也適用於其他Memcache工具。如果我想在內存緩存中存儲一​​個None值,該怎麼辦?

字典獲得()方法允許你指定一個默認值,比如dict.get(「鍵」,「defaultval」)

,如果有可能這是有用的,你可能希望存儲無作爲字典中的一個值。

但是,memcache.get()不允許您這樣做。我修改我的@memoize裝飾,所以它看起來是這樣的:

def memoize(keyformat, time=1000000): 

    """Decorator to memoize functions using memcache.""" 
    def decorator(fxn): 
     def wrapper(*args, **kwargs): 
      key = keyformat + str(args[1:]) + str(kwargs) 
      from google.appengine.api import memcache 
      data = memcache.get(key) 
      if Debug(): return fxn(*args, **kwargs) 
      if data: 
       if data is 'None': data = None 
       return data 
      data = fxn(*args, **kwargs) 
      if data is None: data = 'None' 
      memcache.set(key, data, time) 
      return data 
     return wrapper 
    return decorator 

現在,我敢肯定有,我不應該在第一時間被存儲無值的很好的理由,但讓我們把那個預留現在。除了將None vals轉換爲字符串並返回之外,還有更好的方法可以處理這個問題嗎?

回答

7

一個可能的方法是創建一個新類,爲此定義None,並將其實例分配給緩存(不幸的是,您不能擴展None)。或者,可以使用空字符串「」,或者避免完全存儲None/null值(不存在該鍵意味着None)。

然後檢查你的「無」類的實例,當你檢查mc.get(key)結果(is None== ""等)

+0

我認爲這是最好的方法。它給你一個哨兵值,不能混淆其他任何東西。 – 2009-05-22 10:52:01

+0

這就是我最終做的。謝謝! – jamtoday 2009-05-29 01:15:14

0

不是真的。

您可以將None值存儲爲空字符串,但是沒有辦法將特殊數據存儲在memcache中。

緩存鍵不存在和緩存值爲無有什麼區別?統一這兩種情況可能會更好。

3

你可以做一些Haskell和Scala所做的事情,並存儲一個Option字典。該字典包含兩個密鑰:一個用於指示其有效的密鑰和一個用於保存數據的密鑰。事情是這樣的:

{valid: true, data: whatyouwanttostore} 

這時如果get回報無,你知道緩存被錯過了;如果結果是以None作爲數據的字典,那麼您知道數據在緩存中,但它是錯誤的。

相關問題