如果我想在memcache中存储None值怎么办?

11 投票
3 回答
3705 浏览
提问于 2025-04-15 11:45

这段内容主要是关于Google App Engine的Memcache API,但我相信其他Memcache工具也适用。

字典的.get()方法允许你指定一个默认值,比如说你可以写成dict.get('key', 'defaultval')。

这在你可能想在字典中存储None(表示没有值)作为一个值时会很有用。

但是,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值,但我们先不讨论这个。除了把None值转换成字符串再转换回来,还有没有更好的处理方法呢?

3 个回答

0

其实不是这样的。

你可以把一个空值(None)存成一个空字符串,但实际上在内存缓存(memcache)里没有办法存储特殊的数据。

缓存的键不存在和缓存的值是空值(None)之间有什么区别呢?把这两种情况合并起来处理可能会更好。

4

你可以像Haskell和Scala那样,使用一个选项字典来存储数据。这个字典里有两个键:一个键用来表示数据是否有效,另一个键用来存放实际的数据。比如这样:

{valid: true, data: whatyouwanttostore}

然后,如果get返回None,你就知道缓存没有找到数据;如果结果是一个字典,而数据是None,那你就知道数据在缓存里,但它是无效的。

7

一种可能的方法是创建一个新的类,专门用来表示None,然后把这个类的实例放到缓存里(不过不幸的是,你不能直接扩展None)。另外,你也可以使用空字符串"",或者干脆不存储None/null值(如果没有这个键,就意味着是None)。

然后在检查mc.get(key)的结果时,看看是不是你那个'None'类的实例(可以用is None== ""等方式来检查)。

撰写回答