每天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.mzph.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…