亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Django緩存Cache使用詳解

 更新時(shí)間:2020年11月30日 10:17:46   作者:大江狗  
這篇文章主要介紹了Django緩存Cache使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

緩存(Cache)對(duì)于創(chuàng)建一個(gè)高性能的網(wǎng)站和提升用戶(hù)體驗(yàn)來(lái)說(shuō)是非常重要的,然而對(duì)我們這種只用得起拼多多的碼農(nóng)而言最重要的是學(xué)會(huì)如何使用緩存。今天我們就來(lái)看看緩存Cache應(yīng)用場(chǎng)景及工作原理吧,并詳細(xì)介紹如何在Django中設(shè)置Cache并使用它們。

什么是緩存Cache

緩存是一類(lèi)可以更快的讀取數(shù)據(jù)的介質(zhì)統(tǒng)稱(chēng),也指其它可以加快數(shù)據(jù)讀取的存儲(chǔ)方式。一般用來(lái)存儲(chǔ)臨時(shí)數(shù)據(jù),常用介質(zhì)的是讀取速度很快的內(nèi)存。一般來(lái)說(shuō)從數(shù)據(jù)庫(kù)多次把所需要的數(shù)據(jù)提取出來(lái),要比從內(nèi)存或者硬盤(pán)等一次讀出來(lái)付出的成本大很多。對(duì)于中大型網(wǎng)站而言,使用緩存減少對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)次數(shù)是提升網(wǎng)站性能的關(guān)鍵之一。

為什么要使用緩存Cache

在Django中,當(dāng)用戶(hù)請(qǐng)求到達(dá)視圖后,視圖會(huì)先從數(shù)據(jù)庫(kù)提取數(shù)據(jù)放到模板中進(jìn)行動(dòng)態(tài)渲染,渲染后的結(jié)果就是用戶(hù)看到的網(wǎng)頁(yè)。如果用戶(hù)每次請(qǐng)求都從數(shù)據(jù)庫(kù)提取數(shù)據(jù)并渲染,將極大降低性能,不僅服務(wù)器壓力大,而且客戶(hù)端也無(wú)法即時(shí)獲得響應(yīng)。如果能將渲染后的結(jié)果放到速度更快的緩存中,每次有請(qǐng)求過(guò)來(lái),先檢查緩存中是否有對(duì)應(yīng)的資源,如果有,直接從緩存中取出來(lái)返回響應(yīng),節(jié)省取數(shù)據(jù)和渲染的時(shí)間,不僅能大大提高系統(tǒng)性能,還能提高用戶(hù)體驗(yàn)。 

我們來(lái)看一個(gè)實(shí)際的博客例子。每次當(dāng)我們?cè)L問(wèn)首頁(yè)時(shí),下面視圖都會(huì)從數(shù)據(jù)庫(kù)中提取文章列表,并渲染的模板里去。大多數(shù)情況下,我們的博客不會(huì)更新得那么頻繁,所以文章列表是不變的。這樣用戶(hù)在一定時(shí)間內(nèi)多次訪(fǎng)問(wèn)首頁(yè)時(shí)都從數(shù)據(jù)庫(kù)重新讀取同樣的數(shù)據(jù)是一種很大的浪費(fèi)。

from django.shortcuts import render
 
def index(request):
  # 讀取數(shù)據(jù)庫(kù)等并渲染到網(wǎng)頁(yè)
  article_list = Article.objects.all()
  return render(request, 'index.html', {'article_list': article_list})

使用緩存Cache就可以幫我們解決這個(gè)問(wèn)題。當(dāng)用戶(hù)首次訪(fǎng)問(wèn)博客首頁(yè)時(shí),我們從數(shù)據(jù)庫(kù)中提取文章列表,并將其存儲(chǔ)到緩存里(常用的是內(nèi)存,這取決于你的設(shè)置)。當(dāng)用戶(hù)在單位時(shí)間內(nèi)再次訪(fǎng)問(wèn)首頁(yè)時(shí), Django先檢查緩存是否過(guò)期(本例是15分鐘), 再檢查緩存里文章列表資源是否存在,如果存在,直接從緩存中讀取數(shù)據(jù), 并渲染模板。

from django.shortcuts import render
from django.views.decorators.cache import cache_page
 
 
@cache_page(60 * 15) # 秒數(shù),這里指緩存 15 分鐘
def index(request):
  article_list = Article.objects.all()
  return render(request, 'index.html', {'article_list': article_list})

注意: 在Django中使用緩存前,我們必需先做必要的設(shè)置。

緩存Cache的應(yīng)用場(chǎng)景

緩存主要適用于對(duì)頁(yè)面實(shí)時(shí)性要求不高的頁(yè)面。存放在緩存的數(shù)據(jù),通常是頻繁訪(fǎng)問(wèn)的,而不會(huì)經(jīng)常修改的數(shù)據(jù)。我們來(lái)舉幾個(gè)應(yīng)用例子:

  • 博客文章。假設(shè)用戶(hù)一天更新一篇文章,那么可以為博客設(shè)置1天的緩存,一天后會(huì)刷新。
  • 購(gòu)物網(wǎng)站。商品的描述信息幾乎不會(huì)變化,而商品的購(gòu)買(mǎi)數(shù)量需要根據(jù)用戶(hù)情況實(shí)時(shí)更新。我們可以只選擇緩存商品描述信息。
  • 緩存網(wǎng)頁(yè)片段。比如緩存網(wǎng)頁(yè)導(dǎo)航菜單和腳部(Footer)。

Django緩存設(shè)置

Django中提供了多種緩存方式,如果要使用緩存,需要先在settings.py中進(jìn)行配置,然后應(yīng)用。根據(jù)緩存介質(zhì)的不同,你需要設(shè)置不同的緩存后臺(tái)Backend。

Memcached緩存

Memcached是基于內(nèi)存的緩存,Django原生支持的最快最有效的緩存系統(tǒng)。對(duì)于大多數(shù)場(chǎng)景,我們推薦使用Memcached,數(shù)據(jù)緩存在服務(wù)器端。使用前需要通過(guò)pip安裝memcached的插件python-memcached和pylibmc,可以同時(shí)支持多個(gè)服務(wù)器上面的memcached。

下面是使用pyhon-memcached的設(shè)置。

# localhost
CACHES = {
  'default': {
    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    'LOCATION': '127.0.0.1:11211',
  }
}
 
# unix soket
CACHES = {
  'default': {
    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    'LOCATION': 'unix:/tmp/memcached.sock',
  }
}  
 
CACHES = {
  'default': {
    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    'LOCATION': [
      '172.19.26.240:11211',
      '172.19.26.242:11211',
    ]
    # 我們也可以給緩存機(jī)器加權(quán)重,權(quán)重高的承擔(dān)更多的請(qǐng)求,如下
    'LOCATION': [
      ('172.19.26.240:11211',5),
      ('172.19.26.242:11211',1),
    ]
  }
 }

數(shù)據(jù)庫(kù)緩存

CACHES = {
  'default': {
    'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
    'LOCATION': 'my_cache_table',
  }

文件系統(tǒng)緩存

CACHES = {
  'default': {
    'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
    'LOCATION': '/var/tmp/django_cache',#這個(gè)是文件夾的路徑
    #'LOCATION': 'c:\foo\bar',#windows下的示例
  }
}

本地內(nèi)存緩存

CACHES = {
  'default': {
    'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    'LOCATION': 'unique-snowflake'
  }
}

Django代碼中如何使用Cache

當(dāng)你做好Cache的設(shè)置后,在代碼中你可以有三種方式使用Cache。

  • 在視圖View中使用
  • 在路由URLConf中使用
  • 在模板中使用

在視圖View中使用cache

from django.views.decorators.cache import cache_page
 
@cache_page(60 * 15)
def my_view(request):
  ...

在路由URLConf中使用cache

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

from django.views.decorators.cache import cache_page
 
urlpatterns = [
  path('foo/<int:code>/', cache_page(60 * 15)(my_view)),
]

在模板中使用cache

{% load cache %}
{% cache 500 sidebar request.user.username %}
  .. sidebar for logged in user ..
{% endcache %}

對(duì)于大部分碼農(nóng)而言,我們只需要懂得如何在django中使用cache即可,而不需要詳細(xì)了解django后臺(tái)工作原理,比如Django是如何將數(shù)據(jù)存儲(chǔ)到選定介質(zhì)的以及django是如何判斷緩存是否已經(jīng)過(guò)期的。

Django中使用Cache的高級(jí)技巧

下面我來(lái)介紹下Django中使用cache的一些高級(jí)技巧。

使用cache_control

通常用戶(hù)將會(huì)面對(duì)兩種緩存: 他或她自己的瀏覽器緩存(私有緩存)以及他或她的提供者緩存(公共緩存)。 公共緩存由多個(gè)用戶(hù)使用,而受其它人的控制。 這就產(chǎn)生了你不想遇到的敏感數(shù)據(jù)的問(wèn)題,比如說(shuō)你的銀行賬號(hào)被存儲(chǔ)在公眾緩存中。 因此,Web 應(yīng)用程序需要以某種方式告訴緩存那些數(shù)據(jù)是私有的,哪些是公共的。

解決方案是標(biāo)示出某個(gè)頁(yè)面緩存應(yīng)當(dāng)是私有的。 要在 Django 中完成此項(xiàng)工作,可使用 cache_control 視圖修飾器:

from django.views.decorators.cache import cache_control
 
@cache_control(private=True)
def my_view(request):
# ...

該修飾器負(fù)責(zé)在后臺(tái)發(fā)送相應(yīng)的 HTTP 頭部。

還有一些其他方法可以控制緩存參數(shù)。 例如, HTTP 允許應(yīng)用程序執(zhí)行如下操作:

  1. 定義頁(yè)面可以被緩存的最大時(shí)間。
  2. 指定某個(gè)緩存是否總是檢查較新版本,僅當(dāng)無(wú)更新時(shí)才傳遞所緩存內(nèi)容。

在 Django 中,可使用 cache_control 視圖修飾器指定這些緩存參數(shù)。 在下例中, cache_control 告訴緩存對(duì)每次訪(fǎng)問(wèn)都重新驗(yàn)證緩存并在最長(zhǎng) 3600 秒內(nèi)保存所緩存版本。

from django.views.decorators.cache import cache_control
 
 
@cache_control(must_revalidate=True, max_age=3600)
def my_view(request):
# ...

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

  • public=True
  • private=True
  • no_cache=True
  • no_transform=True
  • must_revalidate=True
  • proxy_revalidate=True
  • max_age=num_seconds
  • s_maxage=num_seconds

使用vary_on_headers

缺省情況下,Django 的緩存系統(tǒng)使用所請(qǐng)求的路徑(如blog/article/1)來(lái)創(chuàng)建其緩存鍵。這意味著不同用戶(hù)請(qǐng)求同樣路徑都會(huì)得到同樣的緩存版本,不考慮客戶(hù)端user-agent, cookie和語(yǔ)言配置的不同, 除非你使用Vary頭部通知緩存機(jī)制需要考慮請(qǐng)求頭里的cookie和語(yǔ)言的不同。

要在 Django 完成這項(xiàng)工作,可使用便利的 vary_on_headers 視圖裝飾器。例如下面代碼告訴Django讀取緩存數(shù)據(jù)時(shí)需要同時(shí)考慮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裝飾器。如果你不在視圖中使用緩存,服務(wù)器端是肯定不會(huì)緩存的,然而用戶(hù)的客戶(hù)端如瀏覽器還是會(huì)緩存一些數(shù)據(jù),這時(shí)你可以使用never_cache禁用掉客戶(hù)端的緩存。

from django.views.decorators.cache import never_cache
 
@never_cache
def myview(request):
# ...

到此這篇關(guān)于Django緩存Cache使用詳解的文章就介紹到這了,更多相關(guān)Django緩存Cache內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Python中的yield表達(dá)式介紹

    基于Python中的yield表達(dá)式介紹

    今天小編就為大家分享一篇基于Python中的yield表達(dá)式詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • Python中的列表及其操作方法

    Python中的列表及其操作方法

    這篇文章主要介紹了Python中的列表及其操作方法,涉及到的方法包括對(duì)列表元素進(jìn)行修改、添加、刪除、排序以及求列表長(zhǎng)度等,此外還介紹了列表的遍歷、數(shù)值列表、切片和元組的一些操作,下文詳細(xì)介紹需要的小伙伴可以參考一下
    2022-03-03
  • Python基于pygame實(shí)現(xiàn)圖片代替鼠標(biāo)移動(dòng)效果

    Python基于pygame實(shí)現(xiàn)圖片代替鼠標(biāo)移動(dòng)效果

    這篇文章主要介紹了Python基于pygame實(shí)現(xiàn)圖片代替鼠標(biāo)移動(dòng)效果,可實(shí)現(xiàn)將鼠標(biāo)箭頭轉(zhuǎn)換成圖形的功能,涉及pygame圖形操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • python實(shí)現(xiàn)用類(lèi)讀取文件數(shù)據(jù)并計(jì)算矩形面積

    python實(shí)現(xiàn)用類(lèi)讀取文件數(shù)據(jù)并計(jì)算矩形面積

    今天小編就為大家分享一篇python實(shí)現(xiàn)用類(lèi)讀取文件數(shù)據(jù)并計(jì)算矩形面積,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Python range、enumerate和zip函數(shù)用法詳解

    Python range、enumerate和zip函數(shù)用法詳解

    這篇文章主要介紹了Python range、enumerate和zip函數(shù)用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 關(guān)于Python使用logging庫(kù)進(jìn)行有效日志管理的方法詳解

    關(guān)于Python使用logging庫(kù)進(jìn)行有效日志管理的方法詳解

    在開(kāi)發(fā)大型軟件或處理復(fù)雜問(wèn)題時(shí),我們經(jīng)常需要一種方法來(lái)記錄和跟蹤程序的運(yùn)行狀態(tài),Python 提供了一個(gè)名為 logging 的標(biāo)準(zhǔn)庫(kù),可以幫助我們更好地完成這項(xiàng)任務(wù),在這篇文章中,我們將介紹如何使用 Python 的 logging 庫(kù)進(jìn)行日志記錄
    2023-06-06
  • 解決python報(bào)錯(cuò):AttributeError:?'ImageDraw'?object?has?no?attribute?'textbbox'

    解決python報(bào)錯(cuò):AttributeError:?'ImageDraw'?object?h

    這篇文章主要給大家介紹了關(guān)于解決python報(bào)錯(cuò):AttributeError:?'ImageDraw'?object?has?no?attribute?'textbbox'的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • python抓取多種類(lèi)型的頁(yè)面方法實(shí)例

    python抓取多種類(lèi)型的頁(yè)面方法實(shí)例

    在本篇文章里小編給大家整理的是關(guān)于python抓取多種類(lèi)型的頁(yè)面方法實(shí)例內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2019-11-11
  • Python3.9.1中使用split()的處理方法(推薦)

    Python3.9.1中使用split()的處理方法(推薦)

    這篇文章主要介紹了Python3.9.1中使用split()的處理方法(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • python樹(shù)狀打印項(xiàng)目路徑的實(shí)現(xiàn)

    python樹(shù)狀打印項(xiàng)目路徑的實(shí)現(xiàn)

    在Python中,要打印當(dāng)前路徑,可以使用os模塊中的getcwd()函數(shù),本文主要介紹了python樹(shù)狀打印項(xiàng)目路徑,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10

最新評(píng)論