這篇文章主要講解了“Django項目緩存優(yōu)化的介紹及具體使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Django項目緩存優(yōu)化的介紹及具體使用”吧!
我們提供的服務(wù)有:做網(wǎng)站、成都做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、富縣ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的富縣網(wǎng)站制作公司大家可以想一下Django的請求響應(yīng)流程:
→ 用戶瀏覽器輸入URL地址
→ Web服務(wù)器將HTTP請求轉(zhuǎn)發(fā)給uWSGI服務(wù)器
→ uWSGI服務(wù)器將Request請求轉(zhuǎn)發(fā)給Django應(yīng)用
→ Django中間件處理Request請求
→ 視圖View處理
→ 模型類Models獲取數(shù)據(jù)
→ 模板Template渲染
→ 再次經(jīng)過Django中間件返回
→ uWSGI服務(wù)器將Response返回給Web服務(wù)器
→ Web服務(wù)器響應(yīng)客戶端的HTTP請求。
這其中耗時最多的2個環(huán)節(jié)通常是視圖中業(yè)務(wù)邏輯處理和從Models獲取數(shù)據(jù)(SQL查詢),對于相同目的請求,也就是業(yè)務(wù)處理邏輯和SQL查詢的數(shù)據(jù)都一樣的請求,每次都進(jìn)行了重復(fù)的計算,并且數(shù)據(jù)是從硬盤讀取而非內(nèi)存。
所以使用緩存有如下好處:
降低服務(wù)器負(fù)載
避免重復(fù)計算
提高系統(tǒng)性能
很簡單,一個Request請求過來,先去緩存中查詢,有就返回;沒有就去數(shù)據(jù)庫查詢并處理,然后把結(jié)果緩存好(供下次請求使用),再返回。用偽代碼解釋的話就是這樣
1. Memcached 效率最高,最快的緩存 2. Database caching 數(shù)據(jù)庫緩存,這個指把數(shù)據(jù)緩存到數(shù)據(jù)表,比如你項目中使用的MySQL,就在MySQL中建表來專門緩存數(shù)據(jù)。不是指用Redis數(shù)據(jù)庫 3. Filesystem caching 文件系統(tǒng)緩存,將緩存會把鍵值存儲到獨(dú)立的文件中去 4. Local-memory caching 使用系統(tǒng)內(nèi)存緩存 5. Dummy caching (for development) 假緩存,只在開發(fā)過程中使用,以調(diào)試緩存接口,數(shù)據(jù)并沒有真正緩存 6. Using a custom cache backend 自定義緩存后端,比如使用Redis
那么問題來了,我該使用哪種緩存呢?
其實常用的也就2種:Memcached或者Reids,其它基本不用考慮了。Redis國內(nèi)用得多,支持RDB和AOF兩種持久化方式,支持高可用集群,技術(shù)和方案很成熟。Memcached是純內(nèi)存存儲,本身不支持持久化,不支持分布式,但是它內(nèi)存管理效率高。
Per-site cache 把整個網(wǎng)站都緩存了,只需要在項目中設(shè)置加入緩存中間鍵的配置,系統(tǒng)便會自動對整個網(wǎng)站進(jìn)行緩存
Per-view cache 緩存某個視圖
Template fragment caching 模板的片段,比如Django模板繼承base.html,通常是不變的導(dǎo)航欄
Low-level cache API 低級別緩存API,比如緩存某個函數(shù)的結(jié)果,或者某個API接口
那么問題又來了,項目中我該選擇什么樣的緩存粒度?
是否需要緩存很簡單,看內(nèi)容是否變化。如果整個視圖的數(shù)據(jù)通常都不變,就使用視圖緩存,某些模板片段的數(shù)據(jù)不變就使用模板片段緩存等等。所以一個項目里面多種緩存粒度都有的
這里只說一下Redis和Memcached的,其它很少用的就不羅列了,需要注意的是系統(tǒng)上要安裝對應(yīng)的緩存服務(wù),Django開發(fā)環(huán)境中要安裝連接緩存服務(wù)的包(比如django-redis或pymemcache)
Memcache緩存設(shè)置
最簡單的,配置地址和端口,不一定是要在本機(jī),也可以是其它網(wǎng)段的服務(wù)器或集群
在本機(jī)的話,也可以使用unix Socket
也可以使用多態(tài)服務(wù)器,不同端口緩存
Redis緩存設(shè)置
截圖一下實戰(zhàn)課程中Redis緩存的配置,緩存網(wǎng)站的數(shù)據(jù)
Django channels頻道層的緩存
Celery緩存,broker和任務(wù)的執(zhí)行結(jié)果
對于Django項目緩存的數(shù)據(jù),我們?nèi)〕鰜砘虼孢M(jìn)去操作,可以不需要直接操作底層的緩存數(shù)據(jù),比如使用原生的Redis或Memcached命令,只需要使用Django提供的緩存API即可。就像我們使用Django ORM一樣,無需關(guān)注底層數(shù)據(jù)庫是MySQL, PostgreSQL或SQLite,ORM語句都一樣。
例如,訪問緩存
使用緩存
除了set(), get()還有g(shù)et_or_set(), get_many(), set_many(), delete(), delete_many(), clear(), touch(), incr(), decr(), close()操作。大家可以去看看官網(wǎng)文檔一個個操作下,要注意的是有的API不是每一個Django版本都有,比如cache.touch()是Django 2.1版本才有的。
緩存使用了,那效果怎么樣,有什么指標(biāo)可以衡量?用什么工具來衡量?
Django Debug Toolbar
這點在之前的Python學(xué)習(xí)教程中有跟大家講到過!
django-debug-toolbar是一個開源的工具,可以在看板上展示django對request/response處理的詳細(xì)信息,比如當(dāng)前請求響應(yīng)的CPU耗時,settings/headers/request信息,當(dāng)前請求使用的模板文件,靜態(tài)文件,具體SQL語句和執(zhí)行時間等等,看板要顯示什么信息是可以靈活配置的。
右邊的欄目就是django-debug-tool的看板
此頁面共有9次SQL查詢,耗時8.62毫秒
緩存命中3次,cache.get(),用時約0.91毫秒
感謝各位的閱讀,以上就是“Django項目緩存優(yōu)化的介紹及具體使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Django項目緩存優(yōu)化的介紹及具體使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!