使用Django-cachalot來緩存你的query
來自: http://python.jobbole.com/84305/
今天介紹個小工具,Django的插件—— https://github.com/BertrandBordage/django-cachalot (Django和抹香鯨?)。這個工具的主要應用場景就是自動幫你緩存你執行過的query結果,以此來幫助網站優化訪問速度。畢竟同樣查詢沒必要hit兩次甚至多次數據庫。
一個遺留的問題場景
話說很久很久之前,遇到過這樣的一個問題,當時還是在用django自帶得admin做項目,新聞的數據量很大,導致每次打開新聞的列表頁都非常慢,把Django上能用的優化都用上之后好了些,但是還是沒有徹底解決。當時貌似沒有考慮用緩存來解決,具體原因忘了,畢竟后臺項目體驗上過得去就行。
看到cachalot之后,突然就想到了這個場景,當時沒有用緩存可能是考慮數據增加很快,緩存的時間設置不好把握,也可能是其他原因。但是cachalot確實是一個值得考慮的方案。
怎么使用cachelot
上面說了些毫無營養的聯想,再來說說怎么使用,github上說的很清楚了,使用相當簡單:
Python
pip install django-cachalot然后Django的installs_app中加入
INSTALLED_APPS = ( ... "cachalot", ... ) 即可</pre>
pipinstalldjango-cachalot然后Django的installs_app中加入
INSTALLED_APPS = ( ... "cachalot", ... ) 即可</pre> </div>
原理
這個項目代碼很少,做的事基本上就是給Django執行sql的那個方法: compiler.execute_sql = patch_execute_sql(compiler.execute_sql) 打個patch,大體邏輯就是,這個sql如果沒執行過就執行,然后緩存結果。 這個是正常得緩存邏輯,那么如果數據進行了更改怎么處理呢,cachalot也對執行寫數據庫的方法打了patch,在寫的時候根據語句對緩存進行刪除。
總結
Djang本身提供了三個層級的cache:整站,view,自定義。cachalot相當于提供了query層級的cache。不過這東西對于單獨的應用是有些幫助,但是對于相互依賴的多個應用就不太適用了,比如:A系統只是用來讀數據的,本身并不寫,這樣緩存始終無法更新。
寫完仔細想想,這東西貌似沒有太多的應用場景。對于小站點或許有用,比如我的博客。但博客已經添加了view層的緩存。或許可以參考cachalot來做些緩存策略上的優化。