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