Django-23 緩存

  • 定義:緩存是一類可以更快的讀取數據的介質統稱,也指其他可以加快數據讀取的存儲方式。一般用來存儲臨時數據,常用介質的是讀取速度很快的內存
  • 意義:視圖渲染有一定成本,數據庫的頻繁查詢過高;所以對於低頻變動的頁面可以考慮使用緩存技術,減少實際渲染次數;用戶拿到響應的時間成本會更低
  • 優化思想:
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響應碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章