Django Memcached 缓存消失

2024-02-12

我的 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在一个不同的线程中,因为我需要更快地从初始调用返回响应,然后填充完整的数据集,所以我想在仍然可以返回响应的同时保持填充在后台进行。


当您设置特定的缓存键并且您设置的项目大于为缓存项目分配的大小时,它会默默失败并且您的键被设置为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 模型实例,则该值可能会变得更大,在这种情况下,可能建议仅从实例中腌制您想要的值。

如需更多阅读,请参阅另一个答案:

如何在 Google AppEngine 上获取 python 对象的大小(以字节为单位)? https://stackoverflow.com/questions/3432402/how-to-get-the-size-of-a-python-object-in-bytes-on-google-appengine

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Memcached 缓存消失 的相关文章

随机推荐