Django缓存
【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客
《Django 5企业级Web应用开发实战(视频教学版)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com)
Django 5框架Web应用开发_夏天又到了的博客-CSDN博客
本节主要介绍关于Django框架缓存方面的内容。Web缓存可以实现加快页面打开速度、减少网络带宽消耗和降低服务器压力等功能,这些是开发Web应用程序必须考虑的问题。
对于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头信息来对它们进行提示,告诉它们应该缓存站点的哪些部分以及如何进行缓存。
缓存系统通常需要进行一些配置,以便明确告诉系统应该将缓存的数据存放在哪里。具体来说,可以选择将缓存数据存储在数据库中、文件系统上或直接存放在内存中。这些不同的存储方式会对缓存性能产生重要影响,因为某些缓存类型可能比其他缓存类型更快。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',
}
}
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
如果没有为数据库缓存模型指定路由方向,则缓存后端将使用默认数据库。当然,如果不使用数据库缓存后端,则无须为数据库缓存模型提供路由指令。