每天40分玩轉Django:Django緩存

一、Django緩存概述

在高并發的Web應用中,緩存是提高性能的重要手段。通過緩存頻繁訪問的數據,可以顯著減少數據庫查詢和渲染模板的時間,從而加快響應速度,提升用戶體驗。Django提供了多層級的緩存方案,可以靈活地滿足不同場景下的緩存需求。

Django支持的緩存方式包括:

  1. 視圖緩存(Per-view cache):對視圖函數的結果進行緩存
  2. 模板片段緩存(Template fragment cache):對模板中的一部分進行緩存
  3. 底層緩存API(Low-level cache API):提供了較低層級的緩存接口
  4. 基于會話的緩存(Session-based cache):利用會話機制實現的緩存

下圖展示了Django多層級緩存結構:

Django
視圖緩存
模板片段緩存
底層緩存API
基于會話的緩存

二、視圖緩存

視圖緩存是最常用的緩存方式,通過緩存視圖函數的返回結果,可以避免重復執行耗時的邏輯和數據庫查詢。Django提供了方便的裝飾器@cache_page來實現視圖緩存。

  1. 使用@cache_page裝飾器
    @cache_page裝飾器接受一個參數timeout,表示緩存過期時間,單位為秒。例如:
from django.views.decorators.cache import cache_page@cache_page(60 * 15)  # 緩存15分鐘
def my_view(request):# 視圖邏輯return render(request, 'my_template.html', {'data': data})

上述代碼對my_view視圖函數的結果進行緩存,緩存時間為15分鐘。在緩存有效期內,重復請求將直接返回緩存的結果,而不會執行視圖函數。

  1. 緩存鍵的生成
    Django會根據請求的URL、請求方法、GET參數等信息自動生成緩存鍵。默認情況下,不同的請求參數會生成不同的緩存鍵。例如:
  • /foo/
  • /foo/?page=1
  • /foo/?page=2

這三個URL會生成不同的緩存結果。如果希望忽略GET參數,可以設置cache_pagekey_prefix參數:

@cache_page(60 * 15, key_prefix='foo')
def my_view(request):pass

這樣,不同的GET參數將使用相同的緩存鍵。

  1. 緩存儲備
    視圖緩存的結果默認存儲在默認的緩存后端中。可以在settings.py中配置緩存后端:
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache','LOCATION': '127.0.0.1:11211',}
}

上述配置使用Memcached作為緩存后端。Django支持多種緩存后端,如Redis、文件系統、數據庫等。

  1. 示例代碼
    下面是一個使用視圖緩存的完整示例:
# views.py
from django.shortcuts import render
from django.views.decorators.cache import cache_page
from .models import Article@cache_page(60 * 15)
def article_list(request):articles = Article.objects.all()return render(request, 'article_list.html', {'articles': articles})
<!-- article_list.html -->
{% for article in articles %}<h2>{{ article.title }}</h2><p>{{ article.content }}</p>
{% endfor %}

訪問article_list視圖時,將從數據庫查詢文章列表,并渲染模板。視圖結果會被緩存15分鐘,在此期間的重復請求將直接返回緩存內容。

下圖展示了視圖緩存的工作流程:

sequenceDiagram
Client->>+Django: GET /article/list/
Django->>+Cache: 檢查緩存
alt 緩存未命中Cache-->>-Django: 無緩存Django->>+Database: 查詢數據Database-->>-Django: 返回數據Django->>Django: 渲染模板Django->>Cache: 寫入緩存
else 緩存命中Cache-->>-Django: 返回緩存
end
Django-->>-Client: 響應結果

三、基于會話的緩存

基于會話的緩存利用Django的會話(Session)機制實現緩存。它將緩存數據存儲在會話中,每個用戶都有獨立的緩存空間。相比視圖緩存,會話緩存更適合存儲與用戶相關的數據,如用戶偏好設置、購物車等。

  1. 啟用會話中間件
    要使用基于會話的緩存,需要確保啟用了會話中間件。在settings.py中添加以下配置:
MIDDLEWARE = [# 其他中間件'django.contrib.sessions.middleware.SessionMiddleware',# 其他中間件
]
  1. 使用會話緩存
    在視圖函數中,可以通過request.session字典來讀寫會話數據。例如:
def my_view(request):# 讀取會話緩存value = request.session.get('my_key', 'default_value')# 寫入會話緩存request.session['my_key'] = 'new_value'return HttpResponse(value)

上述代碼從會話中讀取鍵為’my_key’的值,如果不存在則使用默認值’default_value’。然后將’my_key’的值更新為’new_value’。

  1. 會話過期時間
    默認情況下,Django的會話過期時間為兩周。可以通過SESSION_COOKIE_AGE設置來修改過期時間,單位為秒:
SESSION_COOKIE_AGE = 60 * 60 * 24  # 會話有效期為1天
  1. 示例代碼
    下面是一個使用基于會話的緩存的示例:
# views.py
from django.shortcuts import renderdef set_language(request):lang = request.GET.get('lang', 'en')request.session['language'] = langreturn HttpResponse('Language set to ' + lang)def index(request):lang = request.session.get('language', 'en')return render(request, 'index.html', {'language': lang})
<!-- index.html -->
<p>Current language: {{ language }}</p>
<ul><li><a href="{% url 'set_language' %}?lang=en">English</a></li><li><a href="{% url 'set_language' %}?lang=zh">中文</a></li>
</ul>

在上述示例中,set_language視圖從GET參數獲取語言選項,并將其存儲在會話中。index視圖從會話中讀取語言選項,并渲染模板。用戶可以通過點擊鏈接切換語言,選擇的語言會保存在會話中,在后續請求中生效。

下圖展示了基于會話緩存的工作流程:

Client Django GET /set_language/?lang=zh 將語言選項保存到會話 響應結果 GET /index/ 從會話讀取語言選項 渲染模板 響應結果 Client Django

四、緩存的最佳實踐

在使用Django緩存時,需要注意以下幾點:

  1. 選擇合適的緩存粒度。視圖緩存適合緩存整個頁面,而對于頁面中的局部內容,可以使用模板片段緩存。

  2. 設置合理的緩存過期時間。過期時間太短會導致頻繁的緩存失效,過期時間太長又會影響數據的實時性。需要根據具體業務需求權衡。

  3. 注意緩存數據的一致性。當數據發生變化時,要及時更新或清除相關的緩存,避免出現臟數據。

  4. 合理使用緩存鍵。對于不同的請求參數,要生成不同的緩存鍵,避免緩存結果互相覆蓋。

  5. 監控緩存的命中率和性能指標,找出性能瓶頸,并進行優化。

小結

本文詳細介紹了Django的視圖緩存和基于會話的緩存,通過豐富的示例代碼和流程圖,幫助大家深入理解緩存的工作原理和使用方法。Django緩存是優化Web應用性能的利器,合理利用緩存可以顯著提升響應速度和吞吐量。


怎么樣今天的內容還滿意嗎?再次感謝朋友們的觀看,關注GZH:凡人的AI工具箱,回復666,送您價值199的AI大禮包。最后,祝您早日實現財務自由,還請給個贊,謝謝!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64526.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64526.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64526.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GraphRAG 框架哪家強?選擇最適合你智能問答系統的框架

GraphRAG 框架哪家強&#xff1f;選擇最適合你智能問答系統的框架 點擊進入&#xff1a;GraphRAG系列文章-Nano-GraphRAG&#xff1a;打造輕量級醫療診斷助手 點擊進入&#xff1a;GraphRAG系列文章-突破傳統知識管理瓶頸&#xff1a;LlamaIndex GraphRAG 讓企業知識問答更智能…

Mac電腦python多版本環境安裝與切換

我當前是python3.9.6環境&#xff0c;需要使用3.9.8環境&#xff0c;通過brew安裝3.9.8版本&#xff0c;然后通過pyenv切換環境 步驟 1: 安裝 pyenv brew install pyenv brew install pyenv-virtualenv 步驟 2: 安裝 Python 3.9.8&#xff08;使用 pyenv 安裝指定版本的 Pyth…

Redis--持久化策略(AOF與RDB)

持久化策略&#xff08;AOF與RDB&#xff09; 持久化Redis如何實現數據不丟失&#xff1f;RDB 快照是如何實現的呢&#xff1f;執行時機RDB原理執行快照時&#xff0c;數據能被修改嗎&#xff1f; AOF持久化是怎么實現的&#xff1f;AOF原理三種寫回策略AOF重寫機制 RDB和AOF合…

C高級:思維導圖Day2

目錄 總覽1 總覽2 總覽1 壓縮與解壓縮 打包與解包 軟連接與硬鏈接 ubuntu下關機與重啟指令 總覽2 結束

pwntools用法

pwntools 是一個Python庫&#xff0c; 用于編寫二進制漏洞利用&#xff08;exploitation&#xff09;腳本 功能&#xff1a; 遠程連接和本地連接&#xff1a; 支持通過TCP/UDP連接遠程服務或與本地進程進行交互。Shellcode和ROP鏈構造&#xff1a; 提供了便捷的工具來生成和利…

【每日學點鴻蒙知識】placement設置top、組件攜帶自定義參數、主動隱藏輸入框、Web設置字體、對話框設置全屏寬

1、popup組件placement設置top沒有生效&#xff1f; 可以用offset屬性將popup往下邊偏移一下 來規避 2、組件攜帶自定義參數的接口是哪個&#xff1f; 參考鏈接&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attributes-…

PyTorch快速入門教程【小土堆】之優化器

視頻地址優化器&#xff08;一&#xff09;_嗶哩嗶哩_bilibili import torch import torchvision from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential from torch.utils.data import DataLoaderdataset torchvision.datasets.CIFAR1…

數據庫篇:mysql內置函數

前言 sql 是程序開發員繞不開的一項技能&#xff0c;而mysql是當前最流行的數據庫&#xff0c;熟知其內置的一些函數&#xff0c;可以使我們平時的開發工作更加順暢和方便 時間日期函數 字符串函數 數學計算相關函數 條件判斷函數 加密和壓縮函數 聚合函數 格式或類型轉…

C# 中 Webclient和Httpclient

在C#中&#xff0c;WebClient和HttpClient&#xff0c;這兩個類都是用于發起HTTP請求的客戶端&#xff0c;它們在使用API上傳文件或數據時有不同的優缺點和應用場景。在C#中WebClient是一種較早的網絡客戶端&#xff0c;而HttpClient是后期提供的更現代的、功能更強大的HTTP客戶…

權限獲得第一步

權限獲得第一步 下載打開附件 給了一串加密的密文 一般都是用MD5加密&#xff0c;每一段分別解碼一下 第一段不行&#xff0c;試一下第二段 這里發現第二段可以解碼出來&#xff0c;這應該就是密碼了 flag{3617656}

HTML 輪播圖(Carousel)詳細講解

HTML 輪播圖&#xff08;Carousel&#xff09;詳細講解 輪播圖&#xff08;Carousel&#xff09;是一種常見的用戶界面組件&#xff0c;用于在同一位置展示多個圖像或內容&#xff0c;允許用戶通過滑動或自動播放的方式查看不同的內容。它通常用于展示產品、圖片、廣告等。 1…

25秋招面試總結

秋招從八月底開始&#xff0c;陸陸續續面試了不少&#xff0c;現在也是已經塵埃落定&#xff0c;在這里做一些總結一些我個人的面試經歷 騰訊 騰訊是我最早面試的一家&#xff0c;一開始撈我面試的是數字人民幣&#xff0c;安全方向的崗位&#xff0c;屬于騰訊金融科技這塊。…

一份關于 Ubuntu 系統下代理配置的故障排查筆記

Ubuntu 網絡代理配置與故障排查指南 在使用 Ubuntu 系統時&#xff0c;配置網絡代理可以幫助提升網絡訪問速度或突破網絡限制。然而&#xff0c;代理配置過程中可能會遇到各種問題。本文將詳細介紹如何在 Ubuntu 下配置網絡代理&#xff0c;并提供故障排查的步驟和解決方案。 …

001__VMware軟件和ubuntu系統安裝(鏡像)

[ 基本難度系數 ]:★☆☆☆☆ 一、Vmware軟件和Ubuntu系統說明&#xff1a; a、Vmware軟件的說明&#xff1a; 官網&#xff1a; 歷史版本&#xff1a; 如何下載&#xff1f; b、Ubuntu系統的說明&#xff1a; 4、linux系統的其他版本&#xff1a;紅旗(redhat)、dibian、cent…

fiscoBcos中webase平臺導出java項目

導出合約為java項目并調用 1&#xff0e; 在webase管理平臺上面進行項目的導出 2.將下載好的項目解壓并用idea打開&#xff0c;目錄結構如下 在resources目錄下的abi放的是編譯過后的合約方法&#xff0c;bin.ecc放的是以編譯過后的智能合約&#xff0c;conf文件夾下面放的是鏈…

【嵌入式C語言】指針數組結構體

指針與數組 指針與數組指針數組數組指針 多維數組數組名的保存 結構體定義結構體定義結構體變量使用typedef簡化結構體聲明訪問結構體成員結構體內存分配字節對齊位域定義位域位域的限制示例 指針與數組 指針數組和數組指針是兩個不同的概念&#xff0c;它們涉及到指針和數組的…

Junit4單元測試快速上手

文章目錄 POM依賴引入業務層測試代碼Web層測試代碼生成測試類文件 在工作中我用的最多的單元測試框架是Junit4。通常在寫DAO、Service、Web層代碼的時候都會進行單元測試&#xff0c;方便后續編碼&#xff0c;前端甩鍋。 POM依賴引入 <dependency><groupId>org.spr…

ubuntu 20.04 國內源安裝docker

先更新軟件包&#xff0c;安裝備要apt軟件 # 更新軟件包索引 sudo apt-get update# 安裝需要的軟件包以使apt能夠通過HTTPS使用倉庫 sudo apt-get install ca-certificates curl gnupg lsb-release使用阿里云源 # 添加阿里云官方GPG密鑰 curl -fsSL http://mirrors.aliyun.co…

【優選算法】查找總價格為目標值的兩個商品(雙指針)

算法_云邊有個稻草人的博客-CSDN博客 目錄 解法一&#xff1a;暴力算法 解法二&#xff1a;雙指針(時間復雜度為O&#xff08;N&#xff09;) 【代碼編寫】 LCR 179. 查找總價格為目標值的兩個商品 - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a;暴力算法 用…

時空信息平臺-API安全措施-下篇:登錄鑒權【訪問受限】您的請求已被該站點的安全策略攔截。

文章目錄 引言I 登錄鑒權處理邏輯校驗順序用戶狀態校驗密碼校驗Token鑒權短信驗證碼/圖形驗證碼登錄設備限制II 服務端發生錯誤的處理業務返回碼處理前端處理業務返回碼nginx處理http狀態碼引言 時空信息平臺-API安全措施:上篇(通訊協議的安全措施) https://blog.csdn.net/z…