Django缓存

news/2024/9/17 7:56:48/ 标签: django, 缓存, sqlite

【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客

《Django 5企业级Web应用开发实战(视频教学版)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com)

Django 5框架Web应用开发_夏天又到了的博客-CSDN博客

本节主要介绍关于Django框架缓存方面的内容。Web缓存可以实现加快页面打开速度、减少网络带宽消耗和降低服务器压力等功能,这些是开发Web应用程序必须考虑的问题。

11.1.1  Django缓存概述

对于Web动态网站而言,其基本权衡是动态的。每次用户请求页面时,Web服务器都会进行各种计算,包括从数据库查询数据、将模板渲染成实际的页面内容、处理业务逻辑,以及最终创建可供站点访问者查看的页面。从处理开销的角度来看,这种动态处理方式相较于从文件中读取数据的传统服务器系统而言,成本要高得多。

对于大多数Web应用程序而言,此开销并不大,因为大多数Web应用程序只是流量一般的中小型网站。但是,对于中到高流量站点,则必须尽可能减少开销。这就是Web应用缓存的由来。

缓存某些内容是为了保存成本高昂的计算结果,以便下次不必重复执行计算。下面是一些伪代码,用于说明如何在动态生成的网页中进行缓存

【代码11-1】

01  given a URL, try finding that page in the cache02  if the page is in the cache:03      return the cached page04  else:05      generate the page06      save the generated page in the cache (for next time)07      return the generated page

Django框架带有一个强大的缓存系统,可以保存动态页面,因此不必为每个请求都计算它们。为了方便起见,Django框架提供了不同级别的缓存粒度,既可以缓存特定视图的输出,也可以仅缓存难以生成的片段,甚至可以缓存整个站点。

Django框架还可以与下游缓存(例如Squid和基于浏览器的缓存)配合使用。这些缓存类型并不直接受Django控制,但可以通过提供HTTP头信息来对它们进行提示,告诉它们应该缓存站点的哪些部分以及如何进行缓存

11.1.2  设置缓存

缓存系统通常需要进行一些配置,以便明确告诉系统应该将缓存的数据存放在哪里。具体来说,可以选择将缓存数据存储在数据库中、文件系统上或直接存放在内存中。这些不同的存储方式会对缓存性能产生重要影响,因为某些缓存类型可能比其他缓存类型更快。Web项目的缓存首选项在配置文件中的“CACHES”选项中进行设置。

Memcached是Django框架原生支持的最快、最高效的缓存类型,是一种完全基于内存的缓存服务器。相信Memcached对于大多数设计人员来说并不陌生,其最初是为处理LiveJournal.com网站上的高负载而开发的,随后由Danga Interactive开源。Facebook和Wikipedia等网站使用它来减少数据库访问,并显著提高了网站性能。

Memcached作为守护程序运行,并分配了指定数量的RAM,其所做的只是提供一个用于添加、检索和删除缓存中数据的快速接口。所有数据都直接存储在内存中,因此没有数据库或文件系统使用的开销。

在本地安装好Memcached后,还需要安装Memcached的绑定,最常见的两种Python Memcached绑定方式是python-memcached和pylibmc。

在Django框架中使用Memcached,有下面两种方式:

  • 将BACKEND选项设置为django.core.cache.backends.memcached.MemcachedCache或django.core.cache.backends.memcached.PyLibMCCache,这取决于所选择的Memcached绑定。
  • 将LOCATION选项设置为“ip:port”值,其中ip是Memcached守护程序的IP地址,port是运行Memcached的端口;或者设置为“unix:path”值,其中path是Memcached Unix套接字文件的路径。

Memcached使用python-memcached绑定在本地主机(127.0.0.1)的端口(11211)上运行,代码示例如下:

【代码11-2】

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache','LOCATION': '127.0.0.1:11211',}}

可以使用python-memcached绑定通过本地Unix套接字文件/tmp/memcached.sockf运行的Memcached,代码示例如下:

【代码11-3】

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache','LOCATION': 'unix:/tmp/memcached.sock',}}

当使用pylibmc进行绑定时,切记请不要包括“unix:/”前缀,代码示例如下:

【代码11-4】

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache','LOCATION': '/tmp/memcached.sock',}}

11.1.3  数据库缓存

Django框架可以将其缓存的数据存储在我们的数据库中。如果拥有快速索引良好的数据库服务器,则此方法效果最佳。

要将数据库表用作缓存后端,请执行以下操作:

  • 将BACKEND设置为django.core.cache.backends.db.DatabaseCache。
  • 将LOCATION设置为表名,即数据库表的名称。该名称可以是任何想要的名称,只要它是数据库中尚未使用的有效表名即可。

在下面的代码实例中,缓存表名为“my_cache_table”。

【代码11-5】

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

在使用数据库缓存之前,必须使用以下命令创建缓存表:

python manage.py createcachetable

这个命令将在数据库中创建一张表,该表的格式与Django的数据库缓存系统期望的格式相同,且该表的名称取自LOCATION。

如果将数据库缓存与多个数据库一起使用,则还需要为数据库缓存表设置路由说明。为了进行路由,数据库高速缓存表在名为django_cache的应用程序中显示为名为CacheEntry的模型。该模型不会出现在模型缓存中,但是可以将模型的详细信息用于路由目的。

例如,下面代码实例中的路由器会将所有缓存读取操作定向到cache_replica,并将所有写入操作定向到cache_primary,同时缓存表将同步到cache_primary。

【代码11-6】

01  class CacheRouter:
02      """A router to control all database cache operations"""
03  
04      def db_for_read(self, model, **hints):
05          "All cache read operations go to the replica"
06          if model._meta.app_label == 'django_cache':
07              return 'cache_replica'
08          return None
09  
10      def db_for_write(self, model, **hints):
11          "All cache write operations go to primary"
12          if model._meta.app_label == 'django_cache':
13              return 'cache_primary'
14          return None
15  
16      def allow_migrate(self, db, app_label, model_name=None, **hints):
17          "Only install the cache model on primary"
18          if app_label == 'django_cache':
19              return db == 'cache_primary'
20          return None

如果没有为数据库缓存模型指定路由方向,则缓存后端将使用默认数据库。当然,如果不使用数据库缓存后端,则无须为数据库缓存模型提供路由指令。


http://www.ppmy.cn/news/1522705.html

相关文章

Web3社交新经济,与 SOEX 实现无缝交易的高级安全性

出于充分的理由,安全性是交易中至关重要的考虑因素。每个人都应该确保自己的资金在交易时是安全的。由于 SOEX 充当您与交易所的最佳连接,因此必须强调的是,该系统不会引发任何安全问题。 &a…

C语言程序设计(算法的概念及其表示)

一、算法的概念 一个程序应包括两个方面的内容: 对数据的描述:数据结构 对操作的描述:算法 著名计算机科学家沃思提出一个公式: 数据结构 +算法 =程序 完整的程序设计应该是: 数据结构+算法+程序设计方法+语言工具 广义地说,为解决一个问题而采取的方法和步骤…

帮招一名海康VM机器视觉工程师,工作地:苏州园区,行业:智能仓储自动化巨头,VM可以二次独立开发,岁数35岁以下,薪资18K+

工作职责: 能完成视觉系统的评估,合理的选择硬件配置,快速的完成软件功能开发和调试,并跟踪设备运转状况,保证设备稳定运行 能够清晰的理解客户某个站点的工艺需求,准确定位项目需求;能够根据需…

网络学习-eNSP配置VRRP

虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP) VRRP广泛应用在边缘网络中,是一种路由冗余协议,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,以及即使在实际…

HTTP 一、基础知识

一、概述 1、概述 HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP 是一种应用层协议,是基于 …

微知-BIOS中的XHCI模式是什么意思?(usb3.0的扩展控制器影响usb3.0速率等选项)

XHCI “eXtensible Host Controller Interface” “可扩展主机控制器接口”。 英特尔公司开发的一个USB主机控制器接口,主要面向USB 3.0,同时也支持USB 2.0及以下版本的设备。 是usb3.0的核心部分。 有他表示主机支持usb3.0 三种模式:Smart …

效率神器Listary,附激活码

相信很多人都在用Everything,但是我更钟情于Listary,双击Ctrl即可实现软件调用,支持命令、文件搜索、网络搜索,妥妥的增效神器, 软件使用 文件查找时,双击Ctrl调用搜索框后再双击Ctrl,可以打开…

全国大学生数学建模竞赛全国奖项评阅工作规范(2023年修订稿)

为了适应新的形势,更好地促进全国大学生数学建模竞赛活动的健康发展,进一步提高全国奖项评阅工作的质量和公正、公平性,根据《全国大学生数学建模竞赛章程》和竞赛活动的现状,特制订本规范。 一、评阅组的组成 第一条 全国评阅专家组(以下简称评阅组)由全国大学生数学建…

达梦数据库管理员常用SQL(一)

达梦数据库管理员常用SQL(一) 数据库基本信息数据库参数信息表空间信息日志文件信息进程和线程信息会话连接信息SQL执行信息等待事件信息事务和锁信息数据库基本信息 --查询数据库内部版本号 select id_code; select build_version from v$instance; select * from v$versi…

【游戏安全】CheatEngine基础使用——如何对不同类型的数值进行搜索?如何破解数值加密找到想修改的数值?

游戏安全 不同数值类型的搜索破解简单数值加密 不同数值类型的搜索 可以在游戏中看到很精确的物品数量,但是在CE中却什么都扫不到。 这是因为他的数值类型可能并不是四字节的,在游戏中这个数值的机制是一个慢慢增长的数值,所以他很有可能是…

使用 docker 部署 kvm 图形化管理工具 WebVirtMgr

文章目录 [toc]前提条件镜像构建启动 webvirtmgr创建其他 superuser配置 nginx 反向代理和域名访问绑定 kvm 宿主机local sockettcp 连接 虚拟机创建创建快照虚拟机克隆删除虚拟机 kvm 官方提供了以下这些图形化管理,license 这块也提示了是商业版(Comme…

利士策分享,如何规划多彩的大学生活?

利士策分享,学习规划多彩的大学生活 踏入大学,如同开启一场充满未知与可能的旅程。 为了让这段旅程不仅充满学术的熏陶,还洋溢着生活的多彩与人际的和谐,我们需要精心规划,积极行动。 一、多彩规划:点亮大学…

SpringBoot教程(十五) | SpringBoot集成RabbitMq(消息丢失、消息重复、消息顺序、消息顺序)

SpringBoot教程(十五) | SpringBoot集成RabbitMq(消息丢失、消息重复、消息顺序、消息顺序) RabbitMQ常见问题解决方案问题一:消息丢失的解决方案(1)生成者丢失消息丢失的情景解决方案1&#xf…

点赞收藏功能该如何设计?

这周给一个小伙伴做模拟面试,因为他在公司的项目是一个短视频电商的项目,模仿的是微博。看到他简历里写了做了短视频的收藏功能,于是让他讲讲具体的做法是什么样子的。 结果回答的并不理想,答案里有不少硬伤,今天松哥…

【Python】CSV文件的简单使用

1.读取CSV文件 import csvpath "123.csv"with open(path) as f: # 打开csv文件csvReader csv.reader(f) # 读文件建立Reader对象listReader list(csvReader) # 将数据转换成列表print(listReader)2.写入CSV文件 import csvpath "123.csv"with ope…

uniapp小程序下载缓存服务器上的图片

1. 使用uni.downloadFile,但是注意下载图片的地址里的域名,需要在微信公众平台里面的downloadFile合法域名进行配置。 export default function downloadAndCacheImage(imageUrl, name) {return new Promise((resolve, reject) > {console.log("imageUrl&q…

【消息中间件】Kafka从入门到精通

1 Kafka入门 概念 架构 1.1 概述 1.1.1 初始Kafka Kafka是一个由Scala和Java语言开发的,经典高吞吐量的分布式消息发布和订阅系统,也是大数据技术领域中用作数据交换的核心组件之一。以高吞吐,低延迟,高伸缩,高可靠…

DDD的实现流程

领域驱动设计(DDD)是一种面向领域的软件设计方法。它强调将业务知识和业务逻辑集成到软件设计中,从而提高软件系统的可维护性、可扩展性和可测试性。DDD 的实现流程主要包括以下几个步骤: 确定业务领域 首先,需要明确…

有temp表包含A,B两列,使用SQL,对B列进行处理,形成C列,按A列顺序,B列值不变,则C列累计技术,B列值变化,则C列重新开始计数

有temp表,使用SQL,对B列进行处理,形成C列,按A列顺序,B列值不变,则C列累计技术,B列值变化,则C列重新开始计数 建表语句如下 CREATE TABLE temp(A STRING ,B STRING );INSERT INTO …

C语言 - 预处理详解(一)#预定义符号 ##define #undef

文章目录 前言 一、预定义符号 二、#define (一)、#define 定义的标识符 (二)、#define 定义的宏 (三)、#define 替换规则 (四)、# 和 ## 1、 # 的作用 2、## 的作用 (五)、带副作用的宏参数 (六)、宏和函数的对比 (七)、命名约定 三、#undef 总结 前言 路漫漫其修远兮&#…