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

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

相关推荐
Lonely丶墨轩1 小时前
Redis 缓存策略:借助缓存优化数据库性能并保障数据一致性
数据库·redis·缓存
编程大全3 小时前
41道Django高频题整理(附答案背诵版)
数据库·django·sqlite
趁你还年轻_5 小时前
Redis大量key集中过期怎么办
数据库·redis·缓存
网安小张7 小时前
解锁FastAPI与MongoDB聚合管道的性能奥秘
数据库·python·django
KENYCHEN奉孝7 小时前
Pandas和Django的示例Demo
python·django·pandas
老胖闲聊8 小时前
Python Django完整教程与代码示例
数据库·python·django
noravinsc8 小时前
django paramiko 跳转登录
后端·python·django
践行见远8 小时前
django之请求处理过程分析
数据库·django·sqlite
声声codeGrandMaster8 小时前
Django之表格上传
后端·python·django
菌菌的快乐生活10 小时前
网站静态文件加速-Django项目静态文件存储到腾讯云COS存储提升网络请求速度
django·cos存储