我的django应用程序配置了memcached,一切运行顺利。
我正在尝试随着时间的推移填充缓存,当新数据来自外部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
,因为我需要更快地从初始调用返回响应,然后填充完整的数据集,所以我想保持填充在后台运行仍然可以返回回复。
答案 0 :(得分: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?