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

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

相关推荐
只因在人海中多看了你一眼1 小时前
分布式缓存 + 数据存储 + 消息队列知识体系
分布式·缓存
Dlwyz2 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
Oak Zhang7 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存
门牙咬脆骨7 小时前
【Redis】redis缓存击穿,缓存雪崩,缓存穿透
数据库·redis·缓存
门牙咬脆骨7 小时前
【Redis】GEO数据结构
数据库·redis·缓存
smilejingwei8 小时前
面向 Java 程序员的 SQLite 替代品
开发语言·sqlite·spl·esproc spl
Dlwyz12 小时前
问题: redis-高并发场景下如何保证缓存数据与数据库的最终一致性
数据库·redis·缓存
吴半杯14 小时前
Redis-monitor安装与配置
数据库·redis·缓存
vener_15 小时前
LuckySheet协同编辑后端示例(Django+Channel,Websocket通信)
javascript·后端·python·websocket·django·luckysheet
mariokkm15 小时前
Django一分钟:django中收集关联对象关联数据的方法
android·django·sqlite