每天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.rhkb.cn/news/498212.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Qt事件机制中的定时器事件的闹钟设计

目标 代码 pro文件 QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on …

PawSQL性能巡检平台 (3) - 慢查询采集和优化

在数据库运维管理中&#xff0c;慢查询一直是影响系统性能的重要因素。本文将详细介绍PawSQL数据库性能巡检平台在慢查询管理和优化方面的功能特性&#xff0c;帮助数据库管理员更好地应对性能挑战。 一、PawSQL巡检平台慢查询管理概述 PawSQL平台提供了全面的慢查询管理功能&…

检索增强生成(RAG)的全面综述:演进、当前格局与未来方向

摘要 https://arxiv.org/pdf/2410.12837 本文全面研究了检索增强生成&#xff08;RAG&#xff09;&#xff0c;追溯了其从基础概念到当前最先进技术的演变历程。RAG将检索机制与生成式语言模型相结合&#xff0c;以提高输出的准确性&#xff0c;从而解决了大型语言模型&#…

关于无线AP信道调整的优化(锐捷)

目录 一、信道优化的基本原则二、2.4G频段信道优化三、5G频段信道优化四、信道优化代码具体示例五、其他优化措施 一、信道优化的基本原则 信道优化旨在减少信道间的干扰&#xff0c;提高网络覆盖范围和信号质量。基本原则包括&#xff1a; 1. 选择合适的信道&#xff1a;根据…

拓展C盘内存的方法(C盘旁边不一定是D盘)

问题&#xff1a; 比如&#xff1a;windows现在C盘200GB&#xff0c;D盘600GB&#xff0c;准备额外拓展一个新的盘2TB&#xff0c;如何把新的盘中500GB拓展到C盘中 总结&#xff1a; 通过磁盘管理&#xff1a;如果C盘旁边有未分配空间&#xff0c;可以直接使用“扩展卷”功能…

基于springboot的膳食问答系统的设计与实现

摘 要 本文介绍了一个基于SpringBoot框架的膳食问答系统&#xff0c;该系统融合了文章查看、膳食问答、用户管理、文章管理、知识点管理、系统日志查看、在线用户查看以及办公管理等多项功能。系统采用主流界面设计风格&#xff0c;前端使用HTML构建用户界面&#xff0c;后端则…

如何在LabVIEW中更好地使用ActiveX控件?

在LabVIEW中&#xff0c;ActiveX控件可以帮助实现与其他应用程序或第三方组件的集成&#xff08;例如Microsoft Excel、Word、Internet Explorer等&#xff09;。以下是一些建议&#xff0c;帮助您更好地在LabVIEW中使用ActiveX控件&#xff1a; ​ 1. 理解ActiveX控件的基本原…

使用套接字创建一个服务端,创建一个客户端然后相互通讯

以下是对上述代码的详细解释&#xff1a; #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>#include <stdio.h> #include <stdlib.h> #include <string.h&…

17.3、网络安全应急响应技术与常见的工具

目录 应急响应常用技术分类信息系统容灾恢复入侵取证过程网络安全应急响应参考案例——阿里云安全应急响应服务阿里云应急响应服务网络安全应急响应参考案例—永恒之蓝Wannacry 应急响应常用技术分类 一共五个类别&#xff0c;访问控制、安全评估系统&#xff0c;恢复、安全监测…

MySQL系列之数据类型(String)

导览 前言一、字符串类型知多少 1. 类型说明2. 字符和字节的转换 二、字符串类型的异同 1. CHAR & VARCHAR2. BINARY & VARBINARY3. BLOB & TEXT4. ENUM & SET 结语精彩回放 前言 MySQL数据类型第三弹闪亮登场&#xff0c;欢迎关注O。 本篇博主开始谈谈MySQ…

Ubuntu24.04最新版本安装详细教程

Ubuntu 24.04 LTS发布说明 推荐的系统配置要求&#xff1a; 双核2 GHz处理器或更高 4 GB系统内存 25 GB磁盘存储空间 可访问的互联网 光驱或USB安装介质 Ubuntu 24.04官方下载网址&#xff1a;https://cn.ubuntu.com/download/desktop 04. Ubuntu 22.04(创建虚拟机方式一) 4…

03-系统调用

一、系统调用的概述 1.系统调用介绍 系统调用是操作系统提供给用户用来操作内核服务的一组接口&#xff08;函数&#xff09;的统称。 为什么要通过系统调用来访问系统资源&#xff1f; 因为系统资源不希望被用户随意访问&#xff0c;可能造成各种意想不到的错误&#xff0c;…

3.5mm耳机接口硬件连接

结构 以最复杂的结构为例 简单的结构无非就是没有MIC&#xff08;麦克风&#xff09;接口 上图的5就是Detect的作用 上面这两款产品都为3.5mm的音频插座&#xff0c;图一 为连接4节的音频座&#xff0c;而且有两个开关&#xff0c;1接地&#xff0c;2接MIC&#xff0c;3接左声…

svn不能添加.a文件

解决办法 在home目录下有一个.subversion文件夹&#xff0c;文件夹内有个config文件&#xff0c;里面可以修改过滤的文件类型 在使用命令svn add的时候带上参数–no-ignore&#xff0c;这样就会不顾config中的规则&#xff0c;将指定路径的文件都添加到版本库中 rockyrocky:/e…

计算机网络•自顶向下方法:网络应用原理

网络应用原理 网络应用架构 目前有两种主流的网络应用架构&#xff1a; 客户-服务器架构&#xff08;Client-server&#xff09; 服务器&#xff08;server&#xff09;: 有一台总是在线的主机&#xff0c;上面运行着服务器程序(server)服务器主机(server machine)具有永久的…

net.eval()和net.trasin()的用法

当构建神经网络使用到dropout层等时&#xff0c;网络的正向传播后反向传播神经元的系数会有所不同&#xff0c;因此需要用.eval()和.train()来指定模型方向。 net.train() 作用&#xff1a;将模型设置为训练模式。影响&#xff1a; 启用 Dropout 层&#xff1a;Dropout 会随机…

数据结构与算法-目录

音视频流媒体开发-目录 iOS知识点-目录 Android-目录 Flutter-目录 数据结构与算法-目录 恋上数据结构与算法一 【恋上数据结构与算法一】(一)复杂度 【恋上数据结构与算法一】(二)动态数组 【恋上数据结构与算法一】(三)链表 【恋上数据结构与算法一】(四)栈 【恋上数据结构与…

算法训练营Day28 | leetcode 122.买卖股票的最佳时机II 55.跳跃游戏 45.跳跃游戏II

122.买卖股票的最佳时机II 本题首先要清楚两点&#xff1a; 只有一只股票&#xff01;当前只有买股票或者卖股票的操作 想获得利润至少要两天为一个交易单元。 贪心算法 这道题目可能我们只会想&#xff0c;选一个低的买入&#xff0c;再选个高的卖&#xff0c;再选一个低…

da白话讲深度学习-卷积网络

卷积神经网络(CNN)是指至少在网络的一层中使用卷积运算来代替一般的矩阵乘法运算的神经网络&#xff0c;因此名为为卷积神经网络&#xff08;对于神经网络的发展与类型&#xff0c;可以学习站内的相关文章&#xff09; 1.什么是卷积&#xff1f; 既然是卷积神经网络&#xff…

搭建android开发环境 android studio

1、环境介绍 在进行安卓开发时&#xff0c;需要掌握java&#xff0c;需要安卓SDK&#xff0c;需要一款编辑器&#xff0c;还需要软件的测试环境&#xff08;真机或虚拟机&#xff09;。 早起开发安卓app&#xff0c;使用的是eclipse加安卓SDK&#xff0c;需要自行搭建。 目前开…