(12)Django - 緩存機(jī)制

緩存是將一個(gè)請(qǐng)求的響應(yīng)內(nèi)容保存到內(nèi)存或者高速緩存系統(tǒng)(Memcache)中,若某個(gè)時(shí)間內(nèi)再次發(fā)生同一個(gè)請(qǐng)求,則不再去執(zhí)行請(qǐng)求響應(yīng)過(guò)程,而直接從內(nèi)存或高速緩存系統(tǒng)中獲取該請(qǐng)求的響應(yīng)內(nèi)容返回給用戶。
Django提供了5種不同的緩存方式:

  • Memcached:高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)網(wǎng)站,以減輕數(shù)據(jù)庫(kù)負(fù)載。使用Memcache需要安裝系統(tǒng)服務(wù)器,適合超大型網(wǎng)站使用。
  • 數(shù)據(jù)庫(kù)緩存:緩存信息存儲(chǔ)在網(wǎng)站數(shù)據(jù)庫(kù)的緩存表中,緩存表可以在項(xiàng)目的配置文件中配置,適合大中型網(wǎng)站使用。
  • 文件系統(tǒng)緩存:緩存信息以文本文件格式保存,適合中小型網(wǎng)站使用。
  • 本地內(nèi)存緩存:Django默認(rèn)的緩存保存方式,只適用于項(xiàng)目開(kāi)發(fā)測(cè)試。
  • 虛擬緩存:Django內(nèi)置的虛擬緩存,實(shí)際上只提供緩存接口,并不能儲(chǔ)存緩存數(shù)據(jù),只用于開(kāi)發(fā)測(cè)試。

若在項(xiàng)目中使用緩存機(jī)制,首先需要在配置文件settings.py中設(shè)置緩存的相關(guān)配置。每種緩存方式的配置如下:

Memcached配置
#BACKEND用于配置緩存引擎,LOCATION是Memcached服務(wù)器的IP地址
CACHES = {
    'default':{
        #使用python-memcached模塊連接Memcached
        'BACKEND':'django.core.cache.backends.memcached.MemcachedCache',
        #使用pylibmc模塊連接Memcached
        #'BACKEND':'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION':[
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]
    }
}
數(shù)據(jù)庫(kù)緩存配置
#BACKEND用于配置緩存引擎,LOCATION用于數(shù)據(jù)表的命名
CACHES = {
    'default':{
        'BACKEND':'django.core.cache.backends.db.DatabaseCache',
        'LOCATION':'my_cache_table',
    }
}
文件系統(tǒng)緩存
#BACKEND用于配置緩存引擎,LOCATION是文件保存的路徑
CACHES = {
    'default':{
        'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION':'e:/mysite',
    }
}
本地內(nèi)存緩存
#BACKEND用于配置緩存引擎,LOCATION對(duì)存儲(chǔ)器命名,用于識(shí)別耽擱存儲(chǔ)器
CACHES = {
    'default':{
        'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION':'unique-snowflake',
    }
}
虛擬緩存
#BACKEND用于配置緩存引擎
CACHES = {
    'default':{
        'BACKEND':'django.core.cache.backends.dummy.DummyCache',
    }
}

上述緩存配置僅僅是基本配置,也就是說(shuō)緩存參數(shù)BACKEND和LOCATION是必須配置的,其余的配置參數(shù)可自行選擇。我們以數(shù)據(jù)庫(kù)緩存配置為例,完整的緩存配置如下:

#BACKEND用于配置緩存引擎,LOCATION用于數(shù)據(jù)表的命名
CACHES = {
    'default':{
        'BACKEND':'django.core.cache.backends.db.DatabaseCache',
        'LOCATION':'my_cache_table',
        #設(shè)置緩存的生命周期,以秒為單位,若為None,則永不過(guò)期
        'TIMEOUT': 60,
        'OPTIONS':{
            #MAX_ENTRIES代表最大緩存記錄的數(shù)量
            'MAX_ENTRIES': 1000,
            #當(dāng)緩存到達(dá)最大數(shù)量之后,設(shè)置剔除緩存的數(shù)量
            'CULL_FREQUENCY': 3,
        }
    },
    #設(shè)置多個(gè)緩存數(shù)據(jù)表
    'mysite':{
        'BACKEND':'django.core.cache.backends.db.DatabaseCache',
        'LOCATION':'mysite_cache_table',
}

當(dāng)配置完成數(shù)據(jù)庫(kù)緩存配置后,下一步是在數(shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)緩存表,緩存數(shù)據(jù)表的生成依賴于配置文件中DATABASES的配置信息,如果DATABASES配置了多個(gè)數(shù)據(jù)庫(kù),那么緩存數(shù)據(jù)表默認(rèn)在DATABASES 的default的數(shù)據(jù)庫(kù)中生成。在項(xiàng)目命令行下輸入python manage.py createcachetable指令即可創(chuàng)建緩存數(shù)據(jù)表。

image.png

創(chuàng)建緩存數(shù)據(jù)表之后,就可以在項(xiàng)目中是哪個(gè)緩存了。緩存的使用方式有4種,主要根據(jù)使用對(duì)象的不同來(lái)劃分,具體說(shuō)明如下:

  • 全站緩存:將緩存作用于整個(gè)網(wǎng)站的全部頁(yè)面。一般情況下不采用這種方式實(shí)現(xiàn),會(huì)對(duì)數(shù)據(jù)庫(kù)或Memcached造成極大的壓力。
  • 視圖緩存:將用戶請(qǐng)求的視圖函數(shù)緩存,節(jié)省視圖函數(shù)處理請(qǐng)求信息的時(shí)間和資源
  • 路由(URL)緩存:作用與視圖緩存相同,但兩者是有區(qū)別的。如有兩個(gè)URL同時(shí)指向一個(gè)視圖函數(shù),分別訪問(wèn)這兩個(gè)URL時(shí),路由緩存會(huì)判斷URL是否生成緩存而決定是否執(zhí)行視圖函數(shù)。
  • 模板緩存:對(duì)模板某部分的數(shù)據(jù)設(shè)置緩存,常用于模板內(nèi)容變動(dòng)較少的情況,如<head>標(biāo)簽。

全站緩存

全站緩存作用于整個(gè)網(wǎng)站,當(dāng)用戶向網(wǎng)站發(fā)送請(qǐng)求時(shí),首先經(jīng)過(guò)Django的中間件進(jìn)行處理。因此,使用全站緩存應(yīng)在Django的中間件中配置,配置信息如下:

MIDDLEWARE = [
    #配置全站緩存
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    #使用中文
    'django.middleware.locale.LocaleMiddleware',
    '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',
]
#設(shè)置緩存的生命周期,若在緩存配置CACHES中設(shè)置TIMEOUT屬性,則程序優(yōu)先選擇這里的設(shè)置
CACHE_MIDDLEWARE_SECONDS = 15
#設(shè)置緩存數(shù)據(jù)保存在數(shù)據(jù)表my_cache_table中,屬性值default來(lái)自于緩存配置CACHES的default屬性
CACHE_MIDDLEWARE_ALIAS = 'default'
#設(shè)置緩存表字段cache_key的值,用于同一個(gè)Django項(xiàng)目多個(gè)站點(diǎn)之間的共享緩存
CACHE_MIDDLEWARE_KEY_PREFIX = 'mysite'

啟動(dòng)mysite項(xiàng)目,在瀏覽器上訪問(wèn)的頁(yè)面都會(huì)在緩存數(shù)據(jù)表my_cache_table上生成相應(yīng)的緩存信息。


緩存數(shù)據(jù)表my_cache_table

視圖緩存

視圖緩存是將視圖函數(shù)執(zhí)行過(guò)程中生成緩存數(shù)據(jù),主要以裝飾器的形式來(lái)實(shí)現(xiàn)。裝飾器有三個(gè)參數(shù):timeout、cache和key_prefix,參數(shù)timeout是必選參數(shù),其余兩個(gè)是可選參數(shù)。

#index 的 views.py
from django.views.decorators.cache import cache_page
#參數(shù)cache與全站緩存CACHE_MIDDLEWARE_ALIAS相同
#參數(shù)key_prefix與全站緩存CACHE_MIDDLEWARE_KEY_PREFIX相同
@cache_page(timeout=10, cache='mysite', key_prefix='mysiteView')
@login_required(login_url='/user/login.html')
def shoppingCarView(request):
    pass
    return render(request, 'shoppingCar.html', locals()) 

在瀏覽器上訪問(wèn)購(gòu)物車頁(yè)面,打開(kāi)數(shù)據(jù)庫(kù)查看數(shù)據(jù)緩存表mysite_cache_table的視圖緩存信息,如下圖:


image.png

路由緩存

路由緩存主要在路由配置urls.py中實(shí)現(xiàn),路由緩存cache_page有三個(gè)參數(shù),分別是timeout、cache和key_prefix,參數(shù)timeout是必選參數(shù),其余兩個(gè)參數(shù)是可選參數(shù),參數(shù)的含義與視圖緩存的參數(shù)一致。
代碼如下:

#index的urls.py
from django.urls import path, re_path
from . import views
from django.views.decorators.cache import cache_page

urlpatterns = [
    path('', cache_page(timeout=10,cache='mysite',key_prefix='mysiteURL')(views.index), name='index'),
    path('shoppingCar.html', views.shoppingCarView, name='shoppingCar'),
]

在瀏覽器訪問(wèn)首頁(yè),打開(kāi)數(shù)據(jù)庫(kù)查看緩存數(shù)據(jù)表mysite_cache_table查看路由緩存信息。


image.png

模板緩存

模板緩存是通過(guò)Django的緩存標(biāo)簽實(shí)現(xiàn)的,緩存標(biāo)簽只支持兩個(gè)參數(shù):timeout和key_prefix,以index.html為例實(shí)現(xiàn)模板緩存,代碼如下:

{# 設(shè)置緩存 #}
{% load cache %}
{% cache 10 mysiteTemp %}
<div>要緩存的內(nèi)容</div>
{# 緩存結(jié)束 #}
{% endcache %}

模板緩存的緩存信息默認(rèn)存儲(chǔ)在數(shù)據(jù)表my_cache_table中,打開(kāi)數(shù)據(jù)庫(kù)查看數(shù)據(jù)表my_cache_table的模板緩存信息如下:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 模塊間聯(lián)系越多,其耦合性越強(qiáng),同時(shí)表明其獨(dú)立性越差( 降低耦合性,可以提高其獨(dú)立性)。軟件設(shè)計(jì)中通常用耦合度和內(nèi)聚...
    riverstation閱讀 2,205評(píng)論 0 8
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說(shuō)明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,936評(píng)論 0 9
  • 一、Django框架前言知識(shí): 1、C/S和B/S的區(qū)別: C/S結(jié)構(gòu)軟件:客戶端/服務(wù)端軟件,即客戶端要自己下載...
    月下獨(dú)酌123閱讀 5,114評(píng)論 0 36
  • 點(diǎn)我查看本文集的說(shuō)明及目錄。 本項(xiàng)目相關(guān)內(nèi)容包括: 實(shí)現(xiàn)過(guò)程: CH10 創(chuàng)建一個(gè)在線學(xué)習(xí)平臺(tái) CH11 緩存內(nèi)容...
    學(xué)以致用123閱讀 862評(píng)論 0 2
  • 1. 這是個(gè)什么詞? 詞:uphill 英英釋義:something that is very difficult...
    靜美的秋閱讀 131評(píng)論 0 0

友情鏈接更多精彩內(nèi)容