Django Memcached 缓存消失

Django Memcached Cache Disappears

我用 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 的多次迭代,但在某些时候缓存 returns None 导致整个循环崩溃。我试过增加缓存过期时间,但这并没有改变任何东西。为什么缓存会突然消失?

澄清一下,我是 运行 不同线程中的 apiMoreResultsQuery,因为我需要 return 更快地响应初始调用,然后填充完整数据集,所以我想要在后台继续填充,同时仍然可以 returned 响应。

当您设置一个特定的缓存键并且您正在设置的项目大于为缓存项目分配的大小时,它会静默失败并且您的键被设置为 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?