一、瀏覽器緩存機制
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。
一、Django緩存機制
1、Django緩存原理:
Django根據設置的緩存方式,瀏覽器第一次請求時,cache會緩存單個變量或整個網頁等內容到硬盤或者內存中,同時設置response頭部,當瀏覽器再次發起請求時,附帶f-Modified-Since請求時間到Django,Django 發現f-Modified-Since會先去參數之后,會與緩存中的過期時間相比較,如果緩存時間比較新,則會重新請求數據,並緩存起來然后返回response給客戶端,如果緩存沒有過期,則直接從緩存中提取數據,返回給response給客戶端。
1.1、通用設置:
1.1.1、設置中間件
1 'django.middleware.cache.UpdateCacheMiddleware', #必須設置在第一個位置 2 ...其他中間件... 3 'django.middleware.cache.FetchFromCacheMiddleware',#必須設置在最后一個位置
1.1.2、通用設置:
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.1、Django緩存方式選擇:
2.1.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.2、數據庫緩存
注意的是數據庫緩存使用的是你配置文件中的數據庫作為默認的數據庫,如果一定要選用其他的數據庫,則需要修改數據庫緩存表
生成數據庫表:
運行命令:python manage.py createcachetable my_cache_table
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', }
2.1.3、文件系統緩存
注意是絕對位置(從根目錄開始),必須保證服務器對你列出的路徑具有讀寫權限
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.4、本地內存緩存
本地內存緩存,這個緩存是多進程和線程安全的
1 CACHES = { 2 'default': { 3 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 4 'LOCATION': 'unique-snowflake' 5 } 6 }
緩存LOCATION用來區分每個內存存儲,如果你只有一個本地內存緩存,你可以忽略這個設置;但如果你有多個的時候,你需要至少給他們中一個賦予名字以區分他們。
注意每個進程都有它們自己的私有緩存實例,所以跨進陳緩存是不可能的,因此,本地內存緩存不是特別有效率的,建議你只是在內部開發測時使用,不建議在生產環境中使用
2.1.5、虛擬緩存
虛擬緩存,實際是沒有緩存,只不過你設置緩存時間,請求的時候一樣會設置這個時間,但是服務器並沒有緩存起來,這個在開發測試階段,不希望緩存,發布之后則希望緩存,非常實用,到發布的時候,直接把dummy.DummyCache緩存真真的緩存方式即可,其他的無需修改代碼
1 CACHES = { 2 'default': { 3 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', 4 } 5 }
2.1.6、自定義緩存
1 CACHES = { 2 'default': { 3 'BACKEND': 'path.to.backend', 4 } 5 }
三、獨立視圖緩存
導入
1 from django.views.decorators.cache import cache_page, cache_control, never_cache
3.1、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.2、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