Django緩存機制
一、什么是緩存
動態網站中,用戶請求都要去服務器的數據庫中增刪改查,會消耗很大的資源,因此,使用緩存在減輕服務器的壓力。
緩存是將一些常用的數據保存內存或者memcache中,在一定的時間內有人來訪問這些數據時,則不再去執行數據庫及渲染等操作,而是直接從內存或memcache的緩存中去取得數據,然后返回給用戶。
二、Django的6中緩存方式及配置(只需要改配置文件)
1、開發調試緩存(此模式為開發調試使用,實際上不執行任何操作)
settings.py文件中配置
CACHES = {
'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 緩存后台使用的引擎 'TIMEOUT': 300, # 緩存超時時間(默認300秒,None表示永不過期,0表示立即過期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300) 'CULL_FREQUENCY': 3, # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3) }, } }
2、內存緩存(將緩存內容保存至內存區域中)
settings.py文件中配置
CACHES = {
'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定緩存使用的引擎 'LOCATION': 'unique-snowflake', # 寫在內存中的變量的唯一值 'TIMEOUT':300, # 緩存超時時間(默認為300秒,None表示永不過期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300) 'CULL_FREQUENCY': 3, # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3) } } }
3、文件緩存(將緩存內容保存至文件區域中)
settings.py文件中配置
CACHES = {
'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定緩存使用的引擎 'LOCATION': 'D:\test\cache', #指定緩存的路徑 'TIMEOUT':300, #緩存超時時間(默認為300秒,None表示永不過期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300) 'CULL_FREQUENCY': 3, # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3) } } }
4、數據庫緩存(將緩存內容保存至數據庫區域中)
settings.py文件中配置
CACHES = {
'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 指定緩存使用的引擎 'LOCATION': 'cache_table', # 數據庫表 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300) 'CULL_FREQUENCY': 3, # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3) } } }
5、Memcache緩存(使用python-memcached模塊)
- Memcached是Django原生支持的緩存系統.要使用Memcached,需要下載Memcached的支持庫python-memcached或pylibmc
settings.py文件中配置
CACHES = {
'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定緩存使用的引擎 'LOCATION': '192.168.10.100:8888', # 指定Memcache緩存服務器的IP地址和端口 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300) 'CULL_FREQUENCY': 3, # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3) } } }
LOCATION也可以如下配置:
'LOCATION': 'unix:/tmp/memcached.sock', # 指定局域網內的主機名加socket套接字為Memcache緩存服務器 'LOCATION': [ # 指定一台或多台其他主機ip地址加端口為Memcache緩存服務器 '192.168.10.100:11211', '192.168.10.101:11211', '192.168.10.102:11211', ]
6、Memcache緩存(使用pylibmc模塊)
settings.py文件中配置
CACHES = {
'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', # 指定緩存使用的引擎 'LOCATION':'192.168.10.100:11211', # 指定本機的11211端口為Memcache緩存服務器 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300) 'CULL_FREQUENCY': 3, # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3) }, } }
LOCATION也可以如下配置:
'LOCATION': 'unix:/tmp/memcached.sock', # 指定局域網內的主機名加socket套接字為Memcache緩存服務器 'LOCATION': [ # 指定一台或多台其他主機ip地址加端口為Memcache緩存服務器 '192.168.10.100:11211', '192.168.10.101:11211', '192.168.10.102:11211', ]
三、緩存的應用
1、單頁面使用緩存(用cache_page裝飾器)
- 配置文件中配置緩存
- 視圖層實現緩存
from django.views.decorators.cache import cache_page import time from .models import * # 單頁面使用,用cache_page裝飾器 @cache_page(15) #超時時間為15秒 def index(request): t=time.time() #獲取當前時間 bookList=Book.objects.all() return render(request,"index.html",locals())
2、全局使用緩存(通過中間件實現)
- 用戶的請求通過中間件,經過一系列的認證等操作,如果請求的內容在緩存中存在,則使用
FetchFromCacheMiddleware
獲取內容並返回給用戶 - 當返回給用戶之前,判斷緩存中是否已經存在,如果不存在,則
UpdateCacheMiddleware
會將緩存保存至Django的緩存之中,以實現全站緩存 - 請求來了,是從上到下入走中間件;響應的時候是從下到上走中間件。因此,獲取頁面放在最后,保存頁面放最前面
MIDDLEWARE = [
# 放頁面的時候,應該放在最前面 'django.middleware.cache.UpdateCacheMiddleware', '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', #最后 ]
3、頁面的局部使用緩存
# 在模板層 {% load cache %} # 第一個參數是時間,第二個參數是別名 {% cache 5 'test' %} # 內部的東西會做緩存 # 緩存的時間: {{ ctime }} {% endcache %}
博客內容僅供參考,部分參考他人優秀博文,僅供學習使用