2014-12-01 123 views
1

我正在使用Django 1.7和GeoDjango创建一个网站。当我需要优化网站速度时,我已经达到了目标。Django的查询结果缓存

瓶颈之一是查询执行。即使经过优化,仍有一些查询运行缓慢。 所以我想缓存查询结果并将它们存储在Redis中。

我得到的问题是我无法缓存一些查询结果。特别是那些包含几何类型和距离计算的。我打“TypeError:无法腌制二进制对象”错误。

缓存Django/GeoDjango QuerySets的推荐/正确的方法是什么?

回答

0

原来在存储查询集的主要问题是:

  1. 查询集是懒惰
  2. 评价都需要它们序列化 [link]
  3. 并非所有的查询集可序列化,因为Python的 串行(Pickle)有其自身的局限性[link]

最好的解决方案我发现的是将查询结果缓存在模板中。

所以在我的模板“sample.html”我写的东西,如:

{% cache 600 slow_query_results %} 
<!-- result of page generation --> 
{% endcache %} 

,并鉴于我做的:因为存储在缓存中的数据

from django.core.cache import cache 
from django.core.cache.utils import make_template_fragment_key 
... 
slow_query_results_key = make_template_fragment_key('slow_query_results') 
if not cache.get(slow_query_results_key): 
    # return calculated result 
    slow_query_results = perform_some_slow_query() 

这种方法是罚款预期文本形式。所以在存储数据时应该没有问题/例外。

主要缺点是:

  1. 缓存可能包含重复的类似数据。当您缓存包含语言翻译字符串的html片段等时,可能会发生这种情况。所以在某些情况下,您必须使用语言作为生成缓存的参数。如果你有2种语言的翻译,你将有2个相同数据的缓存。

  2. 你必须在你修改html的情况下使缓存无效。如果您正在缓存的代码块中的html不断更改,这可能会变成真正的痛苦。

我个人认为问题1)没有什么大不了的。问题2)可以通过良好的站点结构规划和知道你可以在Redis中大量失效缓存键来避免。 [link]这是可能的,因为缓存存储在以下密钥格式中:":1:template.cache.slow_query.8a5b358dfc28a6bc1b3397e398d28b66"

因此,应该可以删除与某些缓存块有关的所有缓存键。