【django】緩存機制

緩存機制

由於Django是動態網站,所有每次請求均會去數據進行相應的操作,當程序訪問量大時,耗時必然會更加明顯,最簡單解決方式是使用:緩存,緩存將一個某個views的返回值保存至內存或者memcache中,若某個時間內再次發生同一個請求,則不再去執行請求響應過程,而直接從內存或高速緩存系統中獲取該請求的響應內容返回給用戶。

緩存方式

Django提供了5種不同的緩存方式:

  • Memcached:高性能的分佈式內存對象緩存系統,用於動態網站,以減輕數據庫負載。使用Memcache需要安裝系統服務器,適合超大型網站使用。
  • 數據庫緩存:緩存信息存儲在網站數據庫的緩存表中,緩存表可以在項目的配置文件中配置,適合大中型網站使用。
  • 文件系統緩存:緩存信息以文本文件格式保存,適合中小型網站使用。
  • 本地內存緩存:Django默認的緩存保存方式,只適用於項目開發測試。
  • 虛擬緩存:Django內置的虛擬緩存,實際上只提供緩存接口,並不能儲存緩存數據,只用於開發測試。

使用緩存

想要使用緩存機制需要在配置文件settings.py中設置緩存的相關配置。

緩存相關配置

Memcached配置

CACHES = {
    'default':{
		# 以下配置必須配置

		# 配置緩存引擎        
        # 使用python-memcached模塊連接Memcached:
        'BACKEND':'django.core.cache.backends.memcached.MemcachedCache',
        # 使用pylibmc模塊連接Memcached:
        #'BACKEND':'django.core.cache.backends.memcached.PyLibMCCache',
        # 配置Memcached服務器的IP地址:
        'LOCATION':[
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]
		# 可選配置:
		
		#設置緩存的生命週期,以秒爲單位,若爲None,則永不過期
        'TIMEOUT': 60,
        'OPTIONS':{
            #最大緩存記錄的數量
            'MAX_ENTRIES': 1000,
            #當緩存到達最大數量之後,設置剔除緩存的數量
            'CULL_FREQUENCY': 3,
        }
    }
  
    
}

數據庫緩存配置

#BACKEND用於配置緩存引擎,LOCATION用於數據表的命名
CACHES = {
    'default':{
		# 配置緩存引擎        
        'BACKEND':'django.core.cache.backends.db.DatabaseCache',
        # 數據表的命名
        'LOCATION':'my_cache_table',
    }
}

文件系統緩存

CACHES = {
    'default':{
        # 配置緩存引擎
        'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',
        # 文件保存的路徑
        'LOCATION':'d:/mysite',
    }
}

本地內存緩存

CACHES = {
    'default':{
        #配置緩存引擎
        'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
        # 對存儲器命名,用於識別多個存儲器
        'LOCATION':'unique-snowflake',
    }
}

虛擬緩存

CACHES = {
    'default':{
        #配置緩存引擎
        'BACKEND':'django.core.cache.backends.dummy.DummyCache',
    }
}

通過上面的配置完成了使用緩存的第一步,接下來需要創建數據緩存表,緩存數據表的生成依賴於配置文件中DATABASES的配置信息,如果DATABASES配置了多個數據庫,那麼緩存數據表默認在DATABASES 的default的數據庫中生成。

創建數據緩存表

python manage.py createcachetable

指定緩存作用區域

緩存可以在四個地方指定,根據作用對象不同劃分,可以根據實際業務需求選擇使用

全站緩存

將緩存作用於整個網站的全部頁面。一般情況下不採用這種方式實現,會對數據庫或Memcached造成極大的壓力。

全站緩存作用於整個網站,當用戶向網站發送請求時,首先經過Django的中間件進行處理。因此,使用全站緩存應在Django的中間件中配置。

MIDDLEWARE = [
    '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.UpdateCacheMiddleware',
    #使用中文
    'django.middleware.locale.LocaleMiddleware',
    #配置全站緩存
    'django.middleware.cache.FetchFromCacheMiddleware',
]
#設置緩存的生命週期,若在緩存配置CACHES中設置TIMEOUT屬性,則程序優先選擇這裏的設置
CACHE_MIDDLEWARE_SECONDS = 15
# #設置緩存數據保存在數據表my_cache_table中,屬性值default來自於緩存配置CACHES的default屬性
CACHE_MIDDLEWARE_ALIAS = 'default'
# #設置緩存表字段cache_key的值,用於同一個Django項目多個站點之間的共享緩存
CACHE_MIDDLEWARE_KEY_PREFIX = 'mysite'

視圖緩存

視圖緩存是將視圖函數執行過程中生成緩存數據,主要以裝飾器的形式來實現。裝飾器有三個參數:timeout、cache和key_prefix,參數timeout是必選參數,其餘兩個是可選參數。

from django.shortcuts import render
from django.views.decorators.cache import cache_page
# cache與全站緩存CACHE_MIDDLEWARE_ALIAS相同
# key_prefix與全站緩存CACHE_MIDDLEWARE_KEY_PREFIX相同
@cache_page(10, cache='default', key_prefix='mysite')
def index(request):
    return render(request,"index.html")

路由緩存

作用與視圖緩存相同,但兩者是有區別的。如有兩個URL同時指向一個視圖函數,分別訪問這兩個URL時,路由緩存會判斷URL是否生成緩存而決定是否執行視圖函數。

路由緩存主要在路由配置中實現,路由緩存cache_page有三個參數,分別是timeout、cache和key_prefix,參數timeout是必選參數,其餘兩個參數是可選參數

from django.conf.urls import url
from app1 import views
from django.views.decorators.cache import cache_page
urlpatterns = [
    url(r'^index/', cache_page(10,cache='default', key_prefix='mysite')(views.index)),

模板緩存

對模板某部分的數據設置緩存,常用於模板內容變動較少的情況。通過Django的緩存標籤實現的,緩存標籤只支持兩個參數:timeout和key_prefix,以index.html爲例實現模板緩存

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% load cache %}
    {% cache 10 mysite %}
    <h1>index</h1>
    {% endcache  %}
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章