我正在使用Django 1.7和GeoDjango創建一個網站。當我需要優化網站速度時,我已經達到了目標。Django的查詢結果緩存
瓶頸之一是查詢執行。即使經過優化,仍有一些查詢運行緩慢。 所以我想緩存查詢結果並將它們存儲在Redis中。
我得到的問題是我無法緩存一些查詢結果。特別是那些包含幾何類型和距離計算的。我打「TypeError:無法醃製二進制對象」錯誤。
緩存Django/GeoDjango QuerySets的推薦/正確的方法是什麼?
我正在使用Django 1.7和GeoDjango創建一個網站。當我需要優化網站速度時,我已經達到了目標。Django的查詢結果緩存
瓶頸之一是查詢執行。即使經過優化,仍有一些查詢運行緩慢。 所以我想緩存查詢結果並將它們存儲在Redis中。
我得到的問題是我無法緩存一些查詢結果。特別是那些包含幾何類型和距離計算的。我打「TypeError:無法醃製二進制對象」錯誤。
緩存Django/GeoDjango QuerySets的推薦/正確的方法是什麼?
原來在存儲查詢集的主要問題是:
最好的解決方案我發現的是將查詢結果緩存在模板中。
所以在我的模板「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()
這種方法是罰款預期文本形式。所以在存儲數據時應該沒有問題/例外。
主要缺點是:
緩存可能包含重複的類似數據。當您緩存包含語言翻譯字符串的html片段等時,可能會發生這種情況。所以在某些情況下,您必須使用語言作爲生成緩存的參數。如果你有2種語言的翻譯,你將有2個相同數據的緩存。
你必須在你修改html的情況下使緩存無效。如果您正在緩存的代碼塊中的html不斷更改,這可能會變成真正的痛苦。
我個人認爲問題1)沒有什麼大不了的。問題2)可以通過良好的站點結構規劃和知道你可以在Redis中大量失效緩存鍵來避免。 [link]這是可能的,因爲緩存存儲在以下密鑰格式中:":1:template.cache.slow_query.8a5b358dfc28a6bc1b3397e398d28b66"
因此,應該可以刪除與某些緩存塊有關的所有緩存鍵。