Django快取Cache使用詳解

2022-09-27 04:15:11 字數 4160 閱讀 5838

快取(cache)對於建立乙個高效能的**和提公升使用者體驗來說是非常重要的,然而對我們這種只用得起拼多多的碼農而言最重要的是學會如何使用快取。今天我們就來看看快取cache應用場景及工作原理吧,並詳細介紹如何在django中設定cache並使用它們。

什麼是快取cache

快取是一類可以更快的讀取資料的介質統稱,也指其它可以加快資料讀取的儲存方式。一般用來儲存臨時資料,常用介質的是讀取速度很快的記憶體。一般來說從資料庫多次把所需要的資料提取出來,要比從記憶體或者硬碟等一次讀出來付出的成本大很多。對於中大型**而言,使用快取減少對資料庫的訪問次數是提公升**效能的關鍵之一。

為什麼要使用快取cache

在django中,當使用者請求到達檢視後,檢視會先從資料庫提取資料放到模板中進行動態渲染,渲染後的結果就是使用者看到的網頁。如果使用者每次請求都從資料庫提取資料並渲染,將極大降低效能,不僅伺服器壓力大,而且客戶端也無法即時獲得響應。如果能將渲染後的結果放到速度更快的快取中,每次有請求過來,先檢查快取中是否有對應的資源,如果有,直接從快取中取出來返回響應,節省取資料和渲染的時間,不僅能大大提高系統效能,還能提高使用者體驗。 

我們來看乙個實際的部落格例子。每次當我們訪問首頁時,下面檢視都會從資料庫中提取文章列表,並渲染的模板裡去。大多數情況下,我們的部落格不會更新得那麼頻繁,所以文章列表是不變的。這樣使用者在一定時間內多次訪問首頁時都從資料庫重新讀取同樣的資料是一種很大的浪費。

from django.shortcuts import render

def index(request):

# 讀取資料庫等並渲染到網頁

article_list = article.objects.all()

return render(request, 'index.html', )

使用快取cache就可以幫我們解決這個問題。當使用者首次訪問部落格首頁時,我們從資料庫中提取文章列表,並將其儲存到快取裡(常用的是記憶體,這取決於你的設定)。當使用者在單位時間內再次訪問首頁時, django先檢查快取是否過期(本例是15分鐘), 再檢查快取裡文章列表資源是否存在,如果存在,直接從快取中讀取資料, 並渲染模板。

from django.shortcuts import render

from django.views.decorators.cache import cache_page

@cache_page(60 * 15) # 秒數,這裡指快取 15 分鐘

def index(request):

article_list = article.objects.all()

return render(request, 'index.html', )

注意: 在django中使用快取前,我們必需先做必要的設定。

快取cache的應用場景

快取主要適用於對頁面實時性要求不高的頁面。存放在快取的資料,通常是頻繁訪問的,而不會經常修改的資料。我們來舉幾個應用例子:

django快取設定

django中提供了多種快取方式,如果要使用快取,需要先在settings.py中進行配置,然後應用。根據快取介質的不同,你需要設定不同的快取後台backend。

memcached快取

memcached是基於記憶體的快取,django原生支援的最快最有效的快取系統。對於大多數場景,我們推薦使用memcached,資料快取在伺服器端。使用前需要通過pip安裝memcached的外掛程式python-memcached和pylibmc,可以同時支援多個伺服器上面的memcached。

下面是使用pyhon-memcached的設定。

# localhost

caches = }

# unix soket

caches =

}

caches =

}資料庫快取

caches =

檔案系統快取

caches =

}本地記憶體快取

caches =

}django**中如何使用cache

當你做好cache的設定後,在**中你可以有三種方式使用cache。

在檢視view中使用cache

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)

def my_view(request):

...在路由urlconf中使用cache

這是小編我更喜歡的方式,這樣你就不用修改負責邏輯部分的view了。

from django.views.decorators.cache import cache_page

urlpatterns = [

path('foo//', cache_page(60 * 15)(my_view)),

]在模板中使用cache

.. sidebar for logged in user ..

對於大部分碼農而言,我們只需要懂得如何在django中使用cache即可,而不需要詳細了解django後台工作原理,比如django是如何將資料儲存到選定介質的以及django是如何判斷快取是否已經過期的。

django中使用cache的高階技巧

下面我來介紹下django中使用cache的一些高階技巧。

使用cache_control

通常使用者將會面對兩種快取: 他或她自己的瀏覽器快取(私有快取)以及他或她的提供者快取(公共快取)。 公共快取由多個使用者使用,而受其它人的控制。 這就產生了你不想遇到的敏感資料的問題,比如說你的銀行賬號被儲存在公眾快取中。 因此,web 應用程式需要以某種方式告訴快取那些資料是私有的,哪些是公共的。

解決方案是標示出某個頁面快取應當是私有的。 要在 django 中完成此項工作,可使用 cache_control 檢視修飾器:

from django.views.decorators.cache import cache_control

@cache_control(private=true)

def my_view(request):

# ...

該修飾器負責在後台傳送相應的 http 頭部。

還有一些其他方法可以控制快取引數。 例如, http 允許應用程式執行如下操作:

在 django 中,可使用 cache_control 檢視修飾器指定這些快取引數。 在下例中, cache_control 告訴快取對每次訪問都重新驗證快取並在最長 3600 秒內儲存所快取版本。

from django.views.decorators.cacwww.cppcns.comhe import cache_control

@cache_control(must_revalidate=true, max_age=3600)

def my_view(request):

# ...

在 cache_control() 中,任何合法的cache-control http 指令都是有效的。下面是完整列表:

使用vary_on_headers

預設情況下,django 的快取系統使用所請求的路徑(如blog/article/1)來建立其快取鍵。這意味著不同使用者請求同樣路徑都會得到同樣的快取版本,不考慮客戶端user-agent, cookie和語言配置的不同, 除非你使用vary頭部通知快取機制需要考慮請求頭里的cookie和語言的不同。

要在 dwww.cppcns.comjango 完成這項工作,可使用便利的 vary_on_headers 檢視裝飾器。例如下面**告訴django讀取快取資料時需要同時考慮user-agent和cookie的不同。

from django.views.decorators.vary import vary_on_headers

@vary_on_headers('user-agent', 'cookie')

def my_view(request):

程式設計客棧 ...

使用never_cache禁用快取

如果你想用頭部完全禁掉快取, 你可以使用django.views.decorators.cache.never_cache裝飾器。如果你不在檢視中使用快取,伺服器端是肯定不會快取的,然而使用者的客戶端如瀏覽器還是會快取一些資料,這時你可以使用never_cache禁用掉客戶端的快取。

from django.views.decorators.cache import never_cache

@never_cache

def myview(request):

# ...

使用Cache快取Page頁面

使用cache outputcache duration 15 varybypara none 頁面使用cache,cache的有效期為15 seconds 使用 表示,放在page load裡面 cache manager可以控制這個頁面 告訴cache manager,頁面的有效期為當前時間 1...

spring快取cache的使用

在spring配置檔案中新增schema和spring對快取註解的支援 xmlns xmlns aop xmlns xsi xmlns mvc xmlns context xmlns tx xmlns p xmlns cache xsi schemalocation spring beans 3.0...

使用Cache快取Page頁面

使用cache outputcache duration 15 varybypara none 頁面使用cache,cache的有效期為15 seconds 使用 表示,放在page load裡面 cache manager可以控制這個頁面 告訴cache manager,頁面的有效期為當前時間 1...