2009-05-21 100 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作为数据的字典,那么您知道数据在缓存中,但它是错误的。

相关问题