每天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 render

def set_language(request):
    lang = request.GET.get('lang', 'en')
    request.session['language'] = lang
    return 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大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/945438.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

强化学习——贝尔曼公式

文章目录 前言一、Return的重要性二、State Value三、贝尔曼公式总结 前言 一、Return的重要性 在不同策略下&#xff0c;最终得到的return都会有所不同。因此&#xff0c;return可以用来评估策略。 return的计算公式在基础概念中已经给出&#xff0c;通过包含 γ {\gamma} γ与…

使用MFC编写一个paddleclas预测软件

目录 写作目的 环境准备 下载编译环境 解压预编译库 准备训练文件 模型文件 图像文件 路径整理 准备预测代码 创建预测应用 新建mfc应用 拷贝文档 配置环境 界面布局 添加回cpp文件 修改函数 报错1解决 报错2未解决 修改infer代码 修改MFCPaddleClasDlg.cp…

CSS特效032:2025庆新春,孔明灯向上旋转飘移效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

3D云展厅对文物保护有什么意义?

在文化遗产保护领域&#xff0c;3D云展厅技术的应用正成为一股新兴力量&#xff0c;它不仅改变了文物展示的方式&#xff0c;也为文物保护工作带来了深远的影响。 下面&#xff0c;由【圆桌3D云展厅平台】为大家介绍一下3D云展厅对文物保护意义的详细探讨。 1. 减少物理接触&a…

spring入门程序

安装eclipse https://blog.csdn.net/qq_36437991/article/details/131644570 新建maven项目 安装依赖包 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…

vue 修改vant样式NoticeBar中的图标,不用插槽可以直接用图片

使用文档中是可以直接使用图片链接的 :left-icon"require(../../assets/newImages/noticeImg.png)" <html> .... <NoticeBarmode""color"#C6C6C6"background""v-if"global_info.site_bulletin":left-icon"r…

MySQL数据导出导出的三种办法(1316)

数据导入导出 基本概述 目前常用的有3中数据导入与导出方法&#xff1a; 使用mysqldump工具&#xff1a; 优点&#xff1a; 简单易用&#xff0c;只需一条命令即可完成数据导出。可以导出表结构和数据&#xff0c;方便完整备份。支持过滤条件&#xff0c;可以选择导出部分数据…

【亲测有效】k8s分布式集群安装部署

1.实验环境准备 准备三台centos7虚拟机&#xff0c;用来部署k8s集群&#xff1a; master&#xff08;hadoop1&#xff0c;192.168.229.111&#xff09;配置&#xff1a; 操作系统&#xff1a;centos7.3以及更高版本都可以配置&#xff1a;4核cpu&#xff0c;4G内存&#xff…

点进CSS选择器

CSS 1.直接在标签的style属性进行设置(行内式) //写在数据单元格td标签内的stytle&#xff0c;设置color颜色和font-size字体大小&#xff1b; <td rowspan"3" style"color: red;font-size: 12px;">Web技术与应用</td> 2.写在head标签中的…

【C#特性整理】C#特性及语法基础

1. C#特性 1.1 统一的类型系统 C#中, 所有类型都共享一个公共的基类型. 例如&#xff0c;任何类型的实例都可以通过调用ToString方法将自身转换为一个字符串 1.2 类和接口 接口: 用于将标准与实现隔离, 仅仅定义行为,不做实现. 1.3 属性、方法、事件 属性: 封装了一部分对…

Flutter DragTarget拖拽控件详解

文章目录 1. DragTarget 控件的构造函数主要参数&#xff1a; 2. DragTarget 的工作原理3. 常见用法示例 1&#xff1a;实现一个简单的拖拽目标解释&#xff1a;示例 2&#xff1a;与 Draggable 结合使用解释&#xff1a; 4. DragTarget 的回调详解5. 总结 DragTarget 是 Flutt…

因系统默认 而未注意过的 create UTF-8 files: with no BOM导致的问题

简单记录一次 开发问题 因为一次编码问题&#xff0c;同事帮忙改了 File Encodings的配置。 没有想到 一个随意的改动with no BOM ------ with BOM &#xff08;自言自语 这个选啥&#xff09;&#xff0c;让一个开发 投入了三四个小时 来排查这个问题。尽其所有思路和方法&am…

前端正在被“锈”化

jeff Atwood 在 2007 年说&#xff1a;"any application that can be writen in JavaScript , willeventually be written in JavaScript"&#xff0c;翻译过来就是&#xff1a;“任何可以使用 JavaScript 来编写的应用&#xff0c;并最终也会由 JavaScript 编写”&a…

【Ubuntu】Ubuntu server 18.04 搭建Slurm并行计算环境(包含NFS)

Ubuntu server 18.04 搭建Slurm并行计算环境&#xff08;包含NFS&#xff09; 一、Munge 认证模块 1.1、安装 munge 主节点和子节点都安装munge #安装 sudo apt update && sudo apt install munge libmunge-dev#设置开机启动 sudo systemctl enable munge sudo syste…

SELECT 语句用法大全:数据库查询的核心力量

在数据库的世界中&#xff0c;SELECT 语句犹如一把万能钥匙&#xff0c;开启了数据检索的大门&#xff0c;让我们能够从海量的数据中精准地获取所需的信息。它的用法丰富多样&#xff0c;涵盖了从简单的数据查看&#xff0c;到复杂的数据统计和关联查询等多个方面&#xff0c;为…

小程序配置文件 —— 14 全局配置 - tabbar配置

全局配置 - tabBar配置 tabBar 字段&#xff1a;定义小程序顶部、底部 tab 栏&#xff0c;用以实现页面之间的快速切换&#xff1b;可以通过 tabBar 配置项指定 tab 栏的表现&#xff0c;以及 tab 切换时显示的对应页面&#xff1b; 在上面图中&#xff0c;标注了一些 tabBar …

计算机网络 (8)物理层的传输方式

一、串行传输与并行传输 串行传输 定义&#xff1a;串行传输是一种数据传输方式&#xff0c;指的是逐位地按照顺序传输数据。在串行传输中&#xff0c;数据位逐个按照一定的顺序进行传输&#xff0c;可以通过单条线路或信道进行。特点&#xff1a; 逐位传输&#xff1a;串行传输…

Edge如何获得纯净的启动界面

启动Edge会出现快速链接&#xff0c;推广链接&#xff0c;网站导航&#xff0c;显示小组件&#xff0c;显示信息提要&#xff0c;背景 ●复杂页面 ●精简页面 点击页面设置按钮 关闭快速链接 关闭网站导航 关闭小组件 关闭信息提要 关闭背景 关闭天气提示 精简页面看起来十分舒…

细说STM32F407单片机CAN基础知识及其HAL驱动程序

目录 一、CAN总线结构和传输协议 1、 CAN总线结构 &#xff08;1&#xff09;闭环结构的CAN总线网络 &#xff08;2&#xff09;开环结构的CAN总线网络 &#xff08;3&#xff09;隐性电平和显性电平 2、CAN总线传输协议 &#xff08;1&#xff09;CAN总线传输特点 &am…

计算机的错误计算(一百九十六)

摘要 用两个大模型计算 arccos(0.444). 结果保留 4位有效数字。两个大模型的计算结果相同&#xff0c;并均有误差。 例1. 计算 arccos(0.444). 结果保留 4位有效数字。 下面是与一个大模型的对话。 以上为与一大模型的对话。 下面是与另一大模型的对话。 点评&#xff1a; &…