- 定義:緩存是一類可以更快的讀取數據的介質統稱,也指其他可以加快數據讀取的存儲方式。一般用來存儲臨時數據,常用介質的是讀取速度很快的內存
- 意義:視圖渲染有一定成本,數據庫的頻繁查詢過高;所以對於低頻變動的頁面可以考慮使用緩存技術,減少實際渲染次數;用戶拿到響應的時間成本會更低
- 優化思想:
given a URL, try finding that page in the cache
if the page is in the cache:
return the cached page
else:
generate the page
save the generated page in the cache (for next time)
return the generated page
Django中設置緩存
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.db.DatabaseCache',
'LOCATION':'my_cache_table',
'TIMEOUT':300,#緩存保存時間 單位秒,默認值爲300
'OPTIONS':{
'MAX_ENTRIES':300,#緩存最大數據條數
'CULL_FREQUENCY':2, #緩存條數達到最大值時,刪除1/x的緩存數據
}
}
}
數據緩存到服務器內存中
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.locmen.LocMemCache',
'LOCATION':'unique-snowflake'
}
}
數據緩存到本地文件中
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION':'/var/tmp/django_cache',#這個是文件夾的路徑
# 'LOCATION':'c:\test\cache',#windows下示例
}
}
創建緩存表
python3 manage.py createcachetable
整體緩存策略
方式一:在視圖函數裏,用裝飾器的方式寫
from django.views.decorators.cache import cache_page
@cache_page(30) -> 單位s
def my_view(request):
...
方式二:在路由裏寫
from django.views.decorators.cache import cache_page
urlpatterns = [
path('foo/',cache_page(60)(my_view)),
]
示例:間隔10s後再請求更新緩存
from django.shortcuts import render
from django.http import HttpResponse
import time
from django.views.decorators.cache import cache_page
# Create your views here.
@cache_page(10)
def test_cache(request):
t = time.time()
return HttpResponse('t is %s'%(t))
局部緩存策略
緩存api的使用
先引入cache對象
方式一:使用caches[’CACHE配置key‘]導入具體對象
from django.core.cache import caches
cache1 = caches['myalias']
cache2 = caches['myalias_2']
方式二:
from django.core.cache import cache 相當於直接引入CACHE配置項中的'default'項
1. cache.set(key,value,timeout) - 存儲緩存
- key:緩存的key,字符串類型
- value:python對象
- timeout:緩存存儲時間(s),默認爲CACHES中的TIMEOUT值
- 返回值:None
2. cache.get(key) - 獲取緩存
- key:緩存的key,字符串類型
- 返回值:爲key的具體值,如果沒有數據,則返回None
3. cache.add(key,value) - 存儲緩存,只在key不存在時生效
- 返回值:True[存儲成功] or False[存儲失敗]
4. cache.get_or_set(key,value,timeout) - 如果未獲取到數據,則執行set操作
- 返回值:value
5. cache.set_many(dict,timeout) - 批量存儲緩存
- dict:key和value的字典
- timeout:存儲時間(s)
- 返回值:插入不成功的key的數組
瀏覽器緩存策略
強緩存
不會向服務器發送請求,直接從緩存中讀取資源
- 1,響應頭 - Expires(絕對時間)
定義:緩存過期時間,用來指定資源到期的時間,是服務器端的具體的時間
樣例:Expires:Thu,02 Apr 2030 05:14:18 GMT - 2,響應頭 - Cache-Control(相對時間)
在HTTP/1.1中,Cache-Control主要用於控制網頁緩存。比如當Cache-Control:max-age=120,代表請求創建時間後的120秒,緩存失敗
說明:目前服務器都會帶着這兩個頭同時響應個瀏覽器,瀏覽器優先使用Cache-Control
協商緩存
強緩存中的數據一旦過期,還需要跟服務器進行通信,從而獲取最新數據;思考?如果強緩存的數據是一些靜態文件,大圖片等;
解答:考慮到大圖片這類比較費寬帶且不易變化的數據,強緩存時間到期後,瀏覽器會去跟服務器協商,當前緩存是否可用,如果可用,服務器不必返回數據,瀏覽器繼續使用原來緩存的數據,如果文件不可用,則返回最新數據。
1,Last-Modified響應頭和If-Modified-Since請求頭
說明:
1,Last-Modified爲文件的最近修改時間,瀏覽器第一次請求靜態文件時,服務器如果返回Last-Modified響應頭,則代表該資源爲需協商的緩存。
2,當緩存到期後,瀏覽器將獲取到的Last-Modified值作爲請求頭If-Modified-Since的值,與服務器發請求協商,服務端返回304響應碼[響應體爲空],代表緩存繼續使用,200響應碼代表緩存不可用[響應體爲最新資源]2,ETag響應頭 和 If-None-Match請求頭
說明
1,Etag是服務器響應請求時,返回當前資源文件的一個唯一標示(由服務器生成),只要資源有變化,Etag就會重新生成;
2,緩存到期後,瀏覽器將Etag響應頭的值作爲If-None-Match請求頭的值,給服務器發請求協商;服務器接到請求後,比對文件標識,不一致則認爲資源不可用,返回200響應碼[響應體爲最新資源];可用則返回304響應碼。