緩存就是將你常用的數(shù)據(jù)放在內(nèi)存里面,方便大量的訪問,每次請求過來之后,django都會優(yōu)先訪問緩存,看看緩存里面有沒有需要的數(shù)據(jù),如果沒有的話,再從數(shù)據(jù)庫里面取,緩存里面的數(shù)據(jù)都有超時時間,如果超時間的話就會從數(shù)據(jù)庫里面進(jìn)行更新,一般情況下緩存都是另外一臺機(jī)器的內(nèi)存,也可能放到文件等其他容易訪問的地方,django 里面可以直接調(diào)用緩存
緩存在內(nèi)存中
配置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
'TIMEOUT': 300,
'OPTIONS':{
'MAX_ENTRIES': 300,
'CULL_FREQUENCY': 3,
}
}
}
- 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',就是這個類幫助我們?nèi)【彺婧蛯懢彺?/li>
- 'LOCATION': 'unique-snowflake', 唯一的緩存變量
- 'TIMEOUT': 300, 緩存超時時間(默認(rèn)300,None表示永不過期,0表示立即過期)
- 'MAX_ENTRIES': 300, 最大緩存?zhèn)€數(shù)(默認(rèn)300)緩存?zhèn)€數(shù)不能是無線次的
- 'CULL_FREQUENCY': 3, # 緩存到達(dá)最大個數(shù)之后,剔除緩存?zhèn)€數(shù)的比例,清空1/3即:1/CULL_FREQUENCY(默認(rèn)3)
應(yīng)用
裝飾器 @chche_page(緩存時間)
# 單獨視圖函數(shù):粒度適中
from django.views.decorators.cache import cache_page
@cache_page(5)
def test(request):
# user_list = models.UserInfo.objects.all()
ctime = time.time()
return render(request,'test.html',{'ctime':ctime})
緩存在文件中
配置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': 'D:\cache', #緩存文件路徑
'TIMEOUT': 300, # 緩存超時時間(默認(rèn)300,None表示永不過期,0表示立即過期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大緩存?zhèn)€數(shù)(默認(rèn)300)
'CULL_FREQUENCY': 3, # 緩存到達(dá)最大個數(shù)之后,剔除緩存?zhèn)€數(shù)的比例,即:1/CULL_FREQUENCY(默認(rèn)3)
}
}
}
Memcache緩存
需要找一臺大內(nèi)存的及其然后安裝memcache軟件
鏈接那臺機(jī)器 。。。待續(xù)...
配置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
'TIMEOUT': 300, # 緩存超時時間(默認(rèn)300,None表示永不過期,0表示立即過期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大緩存?zhèn)€數(shù)(默認(rèn)300)
'CULL_FREQUENCY': 3, # 緩存到達(dá)最大個數(shù)之后,剔除緩存?zhèn)€數(shù)的比例,即:1/CULL_FREQUENCY(默認(rèn)3)
}
}
}
應(yīng)用
粒度適中
加載哪個視圖函數(shù)中就在哪個視圖函數(shù)中應(yīng)用,裝飾器 @chche_page(緩存時間)
# 單獨視圖函數(shù):粒度適中
from django.views.decorators.cache import cache_page
@cache_page(5)
def test(request):
# user_list = models.UserInfo.objects.all()
ctime = time.time()
return render(request,'test.html',{'ctime':ctime})
全站緩存,粒度大
全站緩存可以使用中間件了
請求經(jīng)過一層層中間件到最后一個中間件的時候應(yīng)該進(jìn)入讀取緩存,第一次的時候沒有緩存,然后返回最后一個中間件,這時進(jìn)入視圖函數(shù)進(jìn)入數(shù)據(jù)庫取數(shù)據(jù),當(dāng)數(shù)據(jù)返回的時候數(shù)據(jù)從最后一個中間件開始經(jīng)過中間件直到返回到第一個中間件的時候?qū)?shù)據(jù)加載進(jìn)緩存并且給用戶
加中間件
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', # 結(jié)束緩存中間件
]
CACHE_MIDDLEWARE_SECONDS = 5 # 設(shè)定緩存時間,優(yōu)先級比默認(rèn)高
局部緩存,粒度小
在HTML頁面中
{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ ctime }}</h1>
{% cache 5 'xxxxxfdfdf' %} <!--5表示緩存時間,后面的key可以隨便寫-->
<h1>{{ ctime }}</h1>
{% endcache %}
</body>
</html>