緩存
Django是動態Web后台框架,需要實時生成用戶訪問的頁面,進行多次的數據庫操作,但是多次的數據庫訪問操作對於整個Web系統來說,會影響效率,尤其是當訪問量增大時,數據庫的壓力也會越來越大。相對於磁盤及內存操作,數據庫的訪問操作付出的成本要大的多
瀏覽器第一次請求時,
cache會緩存單個變量或整個網頁等內容到硬盤或者內存中,同時設置response頭部當瀏覽器再次發起請求時,會與緩存中的過期時間相比較,如果緩存時間比較新,則會重新請求數據,並緩存起來然后返回
response給客戶端,如果緩存沒有過期,則直接從緩存中提取數據,返回給response給客戶端
Cache-Control
HTTP協議頭Cache-Control,Cache-Control與Expires的作用一致,都是指明當前資源的有效期,控制瀏覽器是否直接從瀏覽器緩存取數據還是重新發請求到服務器取數據。只不過Cache-Control的選擇更多,設置更細致,如果同時設置的話,其優先級高於Expires
在
python中使用memcached需要我們額外安裝memcached作為memcache客戶端的支持
1 |
pip3 install python-memcached -i https://pypi.tuna.tsinghua.edu.cn/simple |
Cache設置
memcached
-
安裝
memcached1
2apt-get install memcached # debian
yum install memcached # centos -
配置文件:
/etc/memcached.conf配置文件中有兩個可能需要修改的參數
1
2-m 64 #memcached所能使用的內存大小
-l 127.0.0.1 #監聽的IP地址 -
開啟|關閉
memcached服務1
2systemctl start memcached # 開啟
systemctl stop memcached # 關閉 -
查看服務狀態
1systemctl status memcached
settings配置
使用
memcached緩存,首先需要在項目的settings文件下進行配置
1 |
CACHES = { |
視圖緩存
可以只為某些視圖函數進行緩存
使用
django.views.decorators.cache下的裝飾器cache_page進行視圖函數裝飾即可
- 模型類的表代碼
1 |
class People(models.Model): |
- 視圖函數代碼
1 |
from django.views.decorators.cache import cache_page |
- 模板頁面代碼
1 |
<!DOCTYPE html> |
在第一次刷新瀏覽器之后,
立即在數據庫中添加一個新的數據對象
接着繼續刷新瀏覽器,前端頁面將會讀取緩存中的結果,而不會顯示剛才添加的用戶
除了在視圖函數上使用裝飾器進行緩存設置,還可以在路由匹配部分使用相同裝飾器函數進行設置
全站緩存
將整站所有視圖設置緩存,需要在配置文件的中間件設置首尾部分添加如下內容
1 |
MIDDLEWARE = [ |
以及搭配設置當前全站緩存有效時間的全局變量
1 |
CACHE_MIDDLEWARE_SECONDS = 10 # 每頁頁面緩存的秒數,默認為600 |
局部緩存
局部緩存主要為在模板頁面,選擇某個區域進行緩存,當用戶再次訪問相同頁面時,如設置緩存未過期,則渲染時局部緩存不會重新生成
1 |
{% load cache %} |
以時間模板變量為例,做一個簡單的測試,后台視圖函數每次在訪問時,返回當前時間
1 |
import time |
模板頁面在使用時的代碼
1 |
{% load cache %} |
手動緩存
除了以上應用於各個業務中的緩存方式,還可以使用
django所提供的cache接口進行緩存設置以及獲取
- 設置緩存
1 |
from django.core.cache import cache |
- 獲取緩存
1 |
#獲取緩存數據 |
- 避免
key值重復導致更新緩存,可以使用cache.add函數,基本用法與set相同
1 |
status = cache.add('add_key', 'New value') |
- 清除緩存,通過
cache.delete方法,該方法接收一個緩存key值
1 |
cache.delete('cache_key') |
- 清空緩存,通過
cache.clear方法,直接從緩存中清除所有
1 |
cache.clear() |
注意
memcached不允許使用超過250個字符或包含空格或控制字符的緩存鍵值使用這樣的鍵值將會導致異常
