1、瀏覽器緩存機制
Cache-control策略(
重點關注)
Cache-Control與Expires的做用一致,都是指明當前資源的有效期,控制瀏覽器是否直接從瀏覽器緩存取數據仍是從新發請求到服務器取數據。只不過Cache-Control的選擇更多,設置更細緻,若是同時設置的話,其優先級高於Expires。
仍是上面那個請求,web服務器返回的Cache-Control頭的值爲max-age=300,即5分鐘(和上面的Expires時間一致,這個不是必須的)。
Last-Modified/If-Modified-Since
Last-Modified/If-Modified-Since要配合Cache-Control使用。
l Last-Modified:標示這個響應資源的最後修改時間。web服務器在響應請求時,告訴瀏覽器資源的最後修改時間。
l If-Modified-Since:當資源過時時(使用Cache-Control標識的max-age),發現資源具備Last-Modified聲明,則再次向web服務器請求時帶上頭 If-Modified-Since,表示請求時間。web服務器收到請求後發現有頭If-Modified-Since 則與被請求資源的最後修改時間進行比對。若最後修改時間較新,說明資源又被改動過,則響應整片資源內容(寫在響應消息包體內),HTTP 200;若最後修改時間較舊,說明資源無新修改,則響應HTTP 304 (無需包體,節省瀏覽),告知瀏覽器繼續使用所保存的cache。
1、Django緩存機制
一、Django緩存原理:
Django根據設置的緩存方式,瀏覽器第一次請求時,cache會緩存單個變量或整個網頁等內容到硬盤或者內存中,同時設置response頭部,當瀏覽器再次發起請求時,附帶f-Modified-Since請求時間到Django,Django 發現f-Modified-Since會先去參數以後,會與緩存中的過時時間相比較,若是緩存時間比較新,則會從新請求數據,並緩存起來而後返回response給客戶端,若是緩存沒有過時,則直接從緩存中提取數據,返回給response給客戶端。
1.一、通用設置:
1.1.一、設置中間件
1 'django.middleware.cache.UpdateCacheMiddleware', #必須設置在第一個位置
2 ...其餘中間件...
3 'django.middleware.cache.FetchFromCacheMiddleware',#必須設置在最後一個位置
1.1.二、通用設置:
1 CACHE_MIDDLEWARE_ALIAS = 'default' #用來存儲的緩存別名
2 CACHE_MIDDLEWARE_SECONDS = 0 #全部頁面默認緩存時間,默認600
3 CACHE_MIDDLEWARE_KEY_PREFIX ='www.demo.com' #關鍵的前綴,當多個站點使用同一個配置的時候,這個能夠設置能夠避免發生衝突,通常設置爲網站域名
4 CACHE_MIDDLEWARE_ANONYMOUS_ONLY = False #那麼只有匿名的請求會被緩存,這是一個禁用緩存非匿名用戶頁面的最簡單的作法,注意確保已經啓用了Django用戶認證中間件
2.一、Django緩存方式選擇:
2.1.一、memcached緩存
須要pip安裝memcached的插件
Python-mencached和pylibmc,能夠同時支持多個服務器上面的memcached
1 'django.core.cache.backends.memcached.MemcachedCache'
2 'django.core.cache.backends.memcached.PyLibMCCache'
3 CACHES = {
4 'default': {
5 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
6 'LOCATION': [
7 '172.19.26.240:11211', #服務器1
8 '172.19.26.242:11211', #服務器2
9 ]
10 #'LOCATION': 'unix:/tmp/memcached.sock', #unix的socket的方式
11 }
12 }
2.1.二、數據庫緩存
注意的是數據庫緩存使用的是你配置文件中的數據庫做爲默認的數據庫,若是必定要選用其餘的數據庫,則須要修改數據庫緩存表
生成數據庫表:
運行命令:python manage.py createcachetable my_cache_table
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table',
}
2.1.三、文件系統緩存
注意是絕對位置(從根目錄開始),必須保證服務器對你列出的路徑具備讀寫權限
1 CACHES = {
2 'default': {
3 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
4 'LOCATION': '/var/tmp/django_cache',#這個是文件夾的路徑
5 #'LOCATION': 'c:\foo\bar',#windows下的示例
6 }
7 }
2.1.四、本地內存緩存
本地內存緩存,這個緩存是多進程和線程安全的
1 CACHES = {
2 'default': {
3 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
4 'LOCATION': 'unique-snowflake'
5 }
6 }
緩存LOCATION用來區分每一個內存存儲,若是你只有一個本地內存緩存,你能夠忽略這個設置;但若是你有多個的時候,你須要至少給他們中一個賦予名字以區分他們。
注意每一個進程都有它們本身的私有緩存實例,因此跨進陳緩存是不可能的,所以,本地內存緩存不是特別有效率的,建議你只是在內部開發測時使用,不建議在生產環境中使用
2.1.五、虛擬緩存
虛擬緩存,實際是沒有緩存,只不過你設置緩存時間,請求的時候同樣會設置這個時間,可是服務器並無緩存起來,這個在開發測試階段,不但願緩存,發佈以後則但願緩存,很是實用,到發佈的時候,直接把dummy.DummyCache緩存真真的緩存方式便可,其餘的無需修改代碼
1 CACHES = {
2 'default': {
3 'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
4 }
5 }
2.1.六、自定義緩存
1 CACHES = {
2 'default': {
3 'BACKEND': 'path.to.backend',
4 }
5 }
3、獨立視圖緩存
導入
1 from django.views.decorators.cache import cache_page, cache_control, never_cache
3.一、cache_page只接受一個參數和兩個關鍵字參數
注意:cache_page裝飾器的方式,即便沒有設置緩存中間件,只要設置的緩存方式,也同樣能夠緩存
- timeout是緩存時間,以秒爲單位
- cache:指定使用你的CACHES設置中的哪個緩存後端
- key_prefix:指定緩存前綴,能夠覆蓋在配置文件中CACHE_MIDDLEWARE_KEY_PREFIX的
1 @cache_page(60 * 15, key_prefix="site1")
2 def my_view(request):
3 或者
4 urlpatterns = ('',
5 (r'^foo/(\d{1,2})/$', cache_page(60 * 15)(my_view)),
6 )
3.二、cache_control控制緩存:使用其餘的頭部信息
其餘的一些關於緩存的問題是:數據的私有性和數據應該被存儲在級聯的緩存的問題。一個用戶面對兩種類型的緩存:本身的瀏覽器緩存(私有的)和提供者的緩存(共有的);一個共有的緩存被多個用戶使用同時被某我的控制,這將涉及到一些敏感的問題,好比你的銀行帳單。所以,咱們的web應用須要一個方法告訴緩存那些數據是私有的,那些是能夠共享的
1 @cache_control(private=True) def my_view(request):
最後列舉cache_control接收到的參數:
- public=True
- private=True
- no_cache=True
- no_transform=True
- must_revalidate=True
- proxy_revalidate=True
- max_age=num_seconds
- s_maxage=num_seconds