当前位置: 首页 > article >正文

Django缓存

【图书介绍】《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 cache

02  if the page is in the cache:

03      return the cached page

04  else:

05      generate the page

06      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.kler.cn/a/290704.html

相关文章:

  • VS Code中怎样查看某分支的提交历史记录
  • 3_TCP/IP连接三次握手与断开四次挥手
  • 深度学习笔记(4)——视频理解
  • Linux第100步_Linux之设置LCD作为终端控制台和LCD背光调节
  • 如何修改pip全局缓存位置和全局安装包存放路径
  • 【开源免费】基于SpringBoot+Vue.JS网上摄影工作室系统(JAVA毕业设计)
  • [论文笔记]Dimensionality Reduction by Learning an Invariant Mapping
  • 深入理解Java虚拟机的类加载机制
  • 无线通信中OFDM符号提前,有啥影响
  • linux 配置 iscsi 存储资源共享
  • html发送邮件的服务器怎么配置?如何设置?
  • GIT使用常见问题
  • 《JavaEE进阶》----7.<SpringMVC实践项目:【登录页面的验证】>
  • JVM:垃圾回收器 垃圾收集器分类 评估GC的性能指标
  • 双向链表
  • python办公自动化:使用`Python-PPTX`自动化与批量处理
  • 从零开始:理解并实践Prompt Flow
  • inotify + rsync 实时同步 ,定时备份
  • Android12上新增jar遇到的问题总结
  • fedora siliverblue adb
  • 为虚拟机配置固定的IP地址(CentOS9)
  • c++162 类的封装和访问
  • 转载【FIR 线性相位系统 最小相位系统 滤波器延迟】
  • 使用Dbeaver 操作 mongodb
  • 「小明赠书活动」第五期“网安三剑客”套系图书《内网渗透技术》《渗透测试技术》《Web应用安全》
  • Luminar Neo for Mac智能图像处理软件【操作简单,轻松上手】