Django如何實(shí)現(xiàn)內(nèi)容緩存示例詳解
前言
本文主要給大家介紹了關(guān)于Django實(shí)現(xiàn)內(nèi)容緩存的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
1.緩存的簡(jiǎn)介
在動(dòng)態(tài)網(wǎng)站中,用戶(hù)所有的請(qǐng)求,服務(wù)器都會(huì)去數(shù)據(jù)庫(kù)中進(jìn)行相應(yīng)的增,刪,查,改,渲染模板,執(zhí)行業(yè)務(wù)邏輯,最后生成用戶(hù)看到的頁(yè)面.
當(dāng)一個(gè)網(wǎng)站的用戶(hù)訪問(wèn)量很大的時(shí)候,每一次的的后臺(tái)操作,都會(huì)消耗很多的服務(wù)端資源,所以必須使用緩存來(lái)減輕后端服務(wù)器的壓力.
緩存是將一些常用的數(shù)據(jù)保存內(nèi)存或者memcache中,在一定的時(shí)間內(nèi)有人來(lái)訪問(wèn)這些數(shù)據(jù)時(shí),則不再去執(zhí)行數(shù)據(jù)庫(kù)及渲染等操作,而是直接從內(nèi)存或memcache的緩存中去取得數(shù)據(jù),然后返回給用戶(hù).
2.Django提供了6種緩存方式
- 開(kāi)發(fā)調(diào)試緩存
- 內(nèi)存緩存
- 文件緩存
- 數(shù)據(jù)庫(kù)緩存
- Memcache緩存(使用python-memcached模塊)
- Memcache緩存(使用pylibmc模塊)
經(jīng)常使用的有文件緩存和Mencache緩存
2.1 各種緩存方式的配置文件說(shuō)明
2.1.1 開(kāi)發(fā)調(diào)試(此模式為開(kāi)發(fā)調(diào)試使用,實(shí)際上不執(zhí)行任何操作)
settings.py文件配置
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 緩存后臺(tái)使用的引擎 'TIMEOUT': 300, # 緩存超時(shí)時(shí)間(默認(rèn)300秒,None表示永不過(guò)期,0表示立即過(guò)期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數(shù)量(默認(rèn)300) 'CULL_FREQUENCY': 3, # 緩存到達(dá)最大個(gè)數(shù)之后,剔除緩存?zhèn)€數(shù)的比例,即:1/CULL_FREQUENCY(默認(rèn)3) }, } }
2.1.2 內(nèi)存緩存(將緩存內(nèi)容保存至內(nèi)存區(qū)域中)
settings.py文件配置
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定緩存使用的引擎 'LOCATION': 'unique-snowflake', # 寫(xiě)在內(nèi)存中的變量的唯一值 'TIMEOUT':300, # 緩存超時(shí)時(shí)間(默認(rèn)為300秒,None表示永不過(guò)期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數(shù)量(默認(rèn)300) 'CULL_FREQUENCY': 3, # 緩存到達(dá)最大個(gè)數(shù)之后,剔除緩存?zhèn)€數(shù)的比例,即:1/CULL_FREQUENCY(默認(rèn)3) } } }
2.1.3 文件緩存(把緩存數(shù)據(jù)存儲(chǔ)在文件中)
settings.py文件配置
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定緩存使用的引擎 'LOCATION': '/var/tmp/django_cache', #指定緩存的路徑 'TIMEOUT':300, #緩存超時(shí)時(shí)間(默認(rèn)為300秒,None表示永不過(guò)期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數(shù)量(默認(rèn)300) 'CULL_FREQUENCY': 3, # 緩存到達(dá)最大個(gè)數(shù)之后,剔除緩存?zhèn)€數(shù)的比例,即:1/CULL_FREQUENCY(默認(rèn)3) } } }
2.1.4 數(shù)據(jù)庫(kù)緩存(把緩存數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中)
settings.py文件配置
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 指定緩存使用的引擎 'LOCATION': 'cache_table', # 數(shù)據(jù)庫(kù)表 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數(shù)量(默認(rèn)300) 'CULL_FREQUENCY': 3, # 緩存到達(dá)最大個(gè)數(shù)之后,剔除緩存?zhèn)€數(shù)的比例,即:1/CULL_FREQUENCY(默認(rèn)3) } } }
注意,創(chuàng)建緩存的數(shù)據(jù)庫(kù)表使用的語(yǔ)句:
python manage.py createcachetable
Memcached是Django原生支持的緩存系統(tǒng).要使用Memcached,需要下載Memcached的支持庫(kù)python-memcached或pylibmc.
2.1.5 Memcache緩存(使用python-memcached模塊連接memcache)
settings.py文件配置
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定緩存使用的引擎 'LOCATION': '192.168.10.100:11211', # 指定Memcache緩存服務(wù)器的IP地址和端口 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數(shù)量(默認(rèn)300) 'CULL_FREQUENCY': 3, # 緩存到達(dá)最大個(gè)數(shù)之后,剔除緩存?zhèn)€數(shù)的比例,即:1/CULL_FREQUENCY(默認(rèn)3) } } }
LOCATION也可以配置成如下:
'LOCATION': 'unix:/tmp/memcached.sock', # 指定局域網(wǎng)內(nèi)的主機(jī)名加socket套接字為Memcache緩存服務(wù)器 'LOCATION': [ # 指定一臺(tái)或多臺(tái)其他主機(jī)ip地址加端口為Memcache緩存服務(wù)器 '192.168.10.100:11211', '192.168.10.101:11211', '192.168.10.102:11211', ]
2.1.6 Memcache緩存(使用pylibmc模塊連接memcache)
settings.py文件配置 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', # 指定緩存使用的引擎 'LOCATION':'192.168.10.100:11211', # 指定本機(jī)的11211端口為Memcache緩存服務(wù)器 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數(shù)量(默認(rèn)300) 'CULL_FREQUENCY': 3, # 緩存到達(dá)最大個(gè)數(shù)之后,剔除緩存?zhèn)€數(shù)的比例,即:1/CULL_FREQUENCY(默認(rèn)3) }, } }
LOCATION也可以配置成如下:
'LOCATION': '/tmp/memcached.sock', # 指定某個(gè)路徑為緩存目錄 'LOCATION': [ # 分布式緩存,在多臺(tái)服務(wù)器上運(yùn)行Memcached進(jìn)程,程序會(huì)把多臺(tái)服務(wù)器當(dāng)作一個(gè)單獨(dú)的緩存,而不會(huì)在每臺(tái)服務(wù)器上復(fù)制緩存值 '192.168.10.100:11211', '192.168.10.101:11211', '192.168.10.102:11211', ]
Memcached是基于內(nèi)存的緩存,數(shù)據(jù)存儲(chǔ)在內(nèi)存中.所以如果服務(wù)器死機(jī)的話,數(shù)據(jù)就會(huì)丟失,所以Memcached一般與其他緩存配合使用
3.Django中的緩存應(yīng)用
Django提供了不同粒度的緩存,可以緩存某個(gè)頁(yè)面,可以只緩存一個(gè)頁(yè)面的某個(gè)部分,甚至可以緩存整個(gè)網(wǎng)站.
3.1 單獨(dú)視圖緩存
例子,為單個(gè)視圖函數(shù)添加緩存
路由配置:
url(r'^index$',views.index),
數(shù)據(jù)庫(kù)
views代碼:
from app01 import models from django.views.decorators.cache import cache_page import time @cache_page(15) #超時(shí)時(shí)間為15秒 def index(request): user_list=models.UserInfo.objects.all() #從數(shù)據(jù)庫(kù)中取出所有的用戶(hù)對(duì)象 ctime=time.time() #獲取當(dāng)前時(shí)間 return render(request,"index.html",{"user_list":user_list,"ctime":ctime})
index.html代碼:
body> <h1>{{ ctime }}</h1> <ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul> </body>
因?yàn)榫彺娴脑?不停的刷新瀏覽器時(shí)會(huì)發(fā)現(xiàn),頁(yè)面上顯示的時(shí)間每15秒鐘變化一次.
在立即刷新瀏覽器的時(shí)候,立即在數(shù)據(jù)庫(kù)中添加一個(gè)用戶(hù)對(duì)象,此時(shí)繼續(xù)刷新瀏覽器,前端頁(yè)面上不會(huì)顯示剛才添加的用戶(hù)
一直刷新瀏覽器15秒后,新添加的用戶(hù)才用在前端頁(yè)面上顯示出來(lái).
上面的例子是基于內(nèi)存的緩存配置,基于文件的緩存該怎么配置呢??
更改settings.py的配置
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 指定緩存使用的引擎 'LOCATION': 'E:\django_cache', # 指定緩存的路徑 'TIMEOUT': 300, # 緩存超時(shí)時(shí)間(默認(rèn)為300秒,None表示永不過(guò)期) 'OPTIONS': { 'MAX_ENTRIES': 300, # 最大緩存記錄的數(shù)量(默認(rèn)300) 'CULL_FREQUENCY': 3, # 緩存到達(dá)最大個(gè)數(shù)之后,剔除緩存?zhèn)€數(shù)的比例,即:1/CULL_FREQUENCY(默認(rèn)3) } } }
然后再次刷新瀏覽器,可以看到在剛才配置的目錄下生成的緩存文件
通過(guò)實(shí)驗(yàn)可以知道,Django會(huì)以自己的形式把緩存文件保存在配置文件中指定的目錄中.
3.2 全站使用緩存
既然是全站緩存,當(dāng)然要使用Django中的中間件.
用戶(hù)的請(qǐng)求通過(guò)中間件,經(jīng)過(guò)一系列的認(rèn)證等操作,如果請(qǐng)求的內(nèi)容在緩存中存在,則使用FetchFromCacheMiddleware獲取內(nèi)容并返回給用戶(hù)
當(dāng)返回給用戶(hù)之前,判斷緩存中是否已經(jīng)存在,如果不存在,則UpdateCacheMiddleware會(huì)將緩存保存至Django的緩存之中,以實(shí)現(xiàn)全站緩存
修改settings.py配置文件
MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', #響應(yīng)HttpResponse中設(shè)置幾個(gè)headers 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware', #用來(lái)緩存通過(guò)GET和HEAD方法獲取的狀態(tài)碼為200的響應(yīng) ] CACHE__MIDDLEWARE_SECONDS=15 # 設(shè)定超時(shí)時(shí)間為15秒
views視圖函數(shù)
from django.shortcuts import render import time def index(request): ctime = time.time() return render(request,'index.html',{'ctime':ctime})
其余代碼不變,刷新瀏覽器是15秒,頁(yè)面上的時(shí)間變化一次,這樣就實(shí)現(xiàn)了全站緩存.
3.3 局部視圖緩存
例子,刷新頁(yè)面時(shí),整個(gè)網(wǎng)頁(yè)有一部分實(shí)現(xiàn)緩存
views視圖函數(shù)
from django.shortcuts import render import time def index(request): # user_list = models.UserInfo.objects.all() ctime = time.time() return render(request,'index.html',{'ctime':ctime})
前端網(wǎng)頁(yè)
{% load cache %} # 加載緩存 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>{{ ctime }}</h1> {% cache 15 'aaa' %} # 設(shè)定超時(shí)時(shí)間為15秒 <h1>{{ ctime }}</h1> {% endcache %} </body> </html>
刷新瀏覽器可以看到,第一個(gè)時(shí)間實(shí)時(shí)變化,后面一個(gè)時(shí)間每15秒鐘變化一次
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
使用pygame實(shí)現(xiàn)垃圾分類(lèi)小游戲功能(已獲校級(jí)二等獎(jiǎng))
這篇文章主要介紹了使用pygame實(shí)現(xiàn)垃圾分類(lèi)小游戲功能(已獲校級(jí)二等獎(jiǎng)),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Python利用BeautifulSoup解析Html的方法示例
BeautifulSoup是python的一個(gè)庫(kù),最主要的功能是從網(wǎng)頁(yè)抓取數(shù)據(jù)。下面這篇文章主要給大家介紹了關(guān)于Python利用BeautifulSoup解析Html的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07Python實(shí)現(xiàn)的調(diào)用C語(yǔ)言函數(shù)功能簡(jiǎn)單實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)的調(diào)用C語(yǔ)言函數(shù)功能,結(jié)合簡(jiǎn)單實(shí)例形式分析了Python使用ctypes模塊調(diào)用C語(yǔ)言函數(shù)的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2019-03-03Python數(shù)據(jù)結(jié)構(gòu)之遞歸方法詳解
這篇文章主要為大家介紹了遞歸的基本概念以及如何構(gòu)建遞歸程序。通過(guò)本章的學(xué)習(xí),大家可以理解遞歸的基本概念,了解遞歸背后蘊(yùn)含的編程思想以及掌握構(gòu)建遞歸程序的方法,需要的可以參考一下2022-04-04Python Django獲取URL中的數(shù)據(jù)詳解
這篇文章主要介紹了Python Django獲取URL中的數(shù)據(jù)詳解,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考2021-11-11使用python+poco+夜神模擬器進(jìn)行自動(dòng)化測(cè)試實(shí)例
這篇文章主要介紹了使用python+poco+夜神模擬器進(jìn)行自動(dòng)化測(cè)試實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python 實(shí)現(xiàn)任意區(qū)域文字識(shí)別(OCR)操作
這篇文章主要介紹了Python 實(shí)現(xiàn)任意區(qū)域文字識(shí)別(OCR)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03