django框架中的緩存系統
一、瀏覽器的緩存機制
Cache-Control策略:
Cache-Control和Expires的作用相似,即指出當前資源的有效期,控制瀏覽器是直接從瀏覽器緩存獲取數據還是發送Request到服務端獲取數據,只不過Cache-Control的選擇方式更多,設置詳細,如果要同時設置,優先級高於Expires。
Cache-Control: max-age=10,即設置緩存存儲的最大周期為10s,這和Date與Expires的差值相對應,private表明響應只能被單個用戶緩存,不能作為共享緩存(即代理服務器不能緩存它)。
Last-Modified:標示這個響應資源的最後修改時間。web服務器在響應請求時,告訴瀏覽器資源的最後修改時間。
二、Django中的緩存機制:
1.Django緩存原理
由於django是動態網站,所以當客戶端發來請求時均會去對數據庫進行相應的操作,當網站訪問量大時,必然會更加耗時,最簡單的解決方式是使用緩存,緩存將某個視圖函數的返回值保存至內存或硬盤中。
django根據設置的緩存方式,瀏覽器第一次請求時,Cache會緩存響應的數據到硬盤或內存中,同時設置Response,當瀏覽器再次Request時,附帶f-Modified-Since請求時間到django,django發現f-Modified-Since會先去參數後,與緩存中的過期時間比較,如果緩存時間比較新,則會重新請求數據,並緩存數據後返回Response給瀏覽器,如果緩存沒有過期,則直接從緩存中獲取數據,Response
給瀏覽器。
1.1、緩存設置
(1)設置中間件
1 ‘django.middleware.cache.UpdateCacheMiddleware‘, #必須設置在第一個位置 2 ...其他中間件... 3 ‘django.middleware.cache.FetchFromCacheMiddleware‘,#必須設置在最後一個位置
(2)通用設置
1 CACHE_MIDDLEWARE_ALIAS = ‘default‘ #緩存別名 2 CACHE_MIDDLEWARE_SECONDS = 0 #頁面默認緩存時間,默認600 3 CACHE_MIDDLEWARE_KEY_PREFIX =‘www.xxx.com‘ #關鍵的前綴,當多個站點使用同一個配置的時候,這個可以設置可以避免發生沖突,一般設置為網站域名 4 CACHE_MIDDLEWARE_ANONYMOUS_ONLY = False #只有匿名的請求會被緩存,這是一個禁用緩存非匿名用戶頁面的最簡單的做法,註意確保已經啟用了Django用戶認證中間件
1.2、Django的緩存方式
(1)內存緩存
利用本地內存緩存,這樣緩存是多進程和線程安全的。
1 # 此緩存將內容保存至內存的變量中 2 # 配置: 3 CACHES = { 4 ‘default‘: { 5 ‘BACKEND‘: ‘django.core.cache.backends.locmem.LocMemCache‘, 6 ‘LOCATION‘: ‘unique-snowflake‘, 7 } 8 }
緩存LOCATION用來區分不同的內存存儲,如果只有一個本地內存緩存,可以忽略,如果有多
個時,需要命名區分。
每個進程都有它們自己的私有緩存實例,所以跨進程緩存是不可能的,因此,本地內存緩存不
是特別有效率,建議只在內部開發測試時使用,不建議生產環境中使用。
(2)Memcached
此緩存使用python-memcached模塊連接Memcache,可以支持多個服務器上的Memcached
CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘, ‘LOCATION‘: ‘127.0.0.1:11211‘, } } CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘, ‘LOCATION‘: ‘unix:/tmp/memcached.sock‘, } } CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘, ‘LOCATION‘: [ ‘210.32.26.202:11211‘, ‘210.32.26.203:11211‘, ] } }
(3)數據庫
註意:數據庫緩存使用的是配置文件中的數據庫作為默認數據庫,如果想使用其他數據庫,需要修改數據庫緩存表
# 此緩存將內容保存至數據庫 # 配置: CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.db.DatabaseCache‘, ‘LOCATION‘: ‘my_cache_table‘, # 數據庫表 } } # 註:執行創建表命令 python manage.py createcachetable 表名
(4)數據庫
註意:數據庫緩存使用的是配置文件中的數據庫作為默認數據庫,如果想使用其他數據庫,需要修改數據庫緩存表
# 此緩存將內容保存至文件 # 配置: CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.filebased.FileBasedCache‘, ‘LOCATION‘: ‘/var/tmp/django_cache‘, } }
1.3、緩存應用
(1)全站應用
即使用中間件,經過一系列的認證等操作,如果內容在緩存中存在,則使用FetchFromCacheMiddleware獲取內容並返回給用戶,當返回給用戶之前,判斷緩存中是否已經存在,如果不存在則UpdateCacheMiddleware會將緩存保存至緩存,從而實現全站緩存。
(2)單獨視圖應用
方式一: from django.views.decorators.cache import cache_page @cache_page(60 * 15) def my_view(request): ... 方式二: from django.views.decorators.cache import cache_page urlpatterns = [ url(r‘^foo/([0-9]{1,2})/$‘, cache_page(60 * 15)(my_view)), ]
(3)局部視圖應用
a. 引入TemplateTag {% load cache %} b. 使用緩存 {% cache 5000 緩存key %} 緩存內容 {% endcache %}
django框架中的緩存系統