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