【问题标题】:Django Memcached Cache DisappearsDjango Memcached 缓存消失
【发布时间】:2015-09-17 23:30:11
【问题描述】:

我用 memcached 配置了我的 django 应用程序,一切运行顺利。

我正在尝试随着时间的推移填充缓存,并在新数据来自外部 API 时添加到缓存中。以下是我正在做的事情的要点:

主视图

api_query, more_results = apiQuery(**params)
cache_key = "mystring"
cache.set(cache_key, data_list, 600)

if more_results:
    t = Thread(target = 'apiMoreResultsQuery', args = (param1, param2, param3))
    t.daemon = True
    t.start()

更多结果功能

cache_key = "mystring"
my_cache = cache.get(cache_key)
api_query, more_results = apiQuery(**params)
new_cache = my_cache + api_query
cache.set(cache_key, new_cache, 600)

if more_results:
    apiMoreResultsQuery(param1, param2, param3)

此方法通过apiMoreResultsQuery 进行多次迭代,但在某些时候缓存返回None 导致整个循环崩溃。我试过增加缓存过期时间,但这并没有改变任何东西。为什么缓存会突然消失?

为了澄清,我在一个不同的线程中运行apiMoreResultsQuery,因为我需要更快地从初始调用返回响应,然后填充完整的数据集,所以我想在响应时保持填充在后台进行还是可以退货的。

【问题讨论】:

    标签: python django caching memcached


    【解决方案1】:

    当您设置特定的缓存键并且您设置的项目大于分配给缓存项目的大小时,它会静默失败并且您的键被设置为None。 (我知道这一点,因为我被它咬过。)

    Memcached 使用pickle 来缓存对象,所以在某些时候new_cache 会得到pickled,它只是比分配给缓存项的大小要大。

    memcached 的默认大小为 1MB,您可以增加它,但似乎有点奇怪的更大问题是您一遍又一遍地使用相同的密钥并且您的单个缓存项只是变得越来越大。

    在缓存中设置新项目并确保这些项目足够小以进行缓存不是更好的策略吗?

    无论如何,如果您想查看您的项目增长到多大,以便测试它是否会进入缓存,您可以执行以下操作:

    >>> import pickle
    >>> some_object = [1, 2, 3]
    >>> len(pickle.dumps(some_object, -1))
    22
    >>> new_object = list(range(1000000))
    >>> len(pickle.dumps(new_object, -1))
    4871352   # Wow, that got pretty big!
    

    请注意,如果您正在酸洗 Django 模型实例,这可能会变得更大,在这种情况下,可能建议您只从实例中酸洗您想要的值。

    如需更多阅读,请参阅其他答案:

    How to get the size of a python object in bytes on Google AppEngine?

    【讨论】:

    • 谢谢,这为我澄清了一些事情。只是为了后代,我能够通过将-I 3M 添加到/etc/memcached.conf 并重新启动memcached 来纠正这个问题。这将允许的最大对象大小增加到 3MB,这应该足以满足我的需要。
    • 有什么理由会在一夜之间恢复吗?昨天它工作没问题,但现在我又回到了原点。当我尝试拉缓存时得到None
    • 我不知道。根据您最初发布的代码,我首先会怀疑该项目的大小。它的某些方面真的很容易导致一个巨大的项目。这也是我从不依赖调整默认缓存大小的原因:我总是在项目大小可变时检查它们的大小。
    • 我一直在检查大小,尽管增加了限制,但大小再次达到 1MB 时似乎正在发生。这绝对是昨天的工作。我很困惑。
    猜你喜欢
    • 2017-05-18
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2012-08-30
    相关资源
    最近更新 更多