版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

一、设置缓存

Django支持基于数据库的、文件的和内存的缓存。通常我们首先要对其进行设置。Django关于缓存的设置都位于settings.py中的CACHES配置项中。

Django支持下面几种缓存系统:

1. Memcached

Memcached是Django原生支持的缓存系统,速度快,效率高。Memcached是一种基于内存的缓存服务,起初是为了解决LiveJournal.com的负载问题而开发的,后来由Danga开源。 它被类似Facebook和维基百科这种大型网站使用,用来减少数据库访问次数,显著地提高了网站的性能。

Memcached会启动一个守护进程,并分配单独的内存块。其主要工作就是为缓存提供一个快速的添加,检索,删除的接口。所有的数据直接存储在内存中,所以它不能取代数据库或者文件系统的功能。如果你对缓存很熟悉,这些内容都很好理解。

如果你是新手,那么要清楚:

  • Memcached不是Django自带的软件,而是一个独立的软件,需要你自己安装、配置和启动服务;
  • Memcached安装好了后,还要安装Python操作Memcached的依赖库,最常用的是python-memcached和pylibmc;
  • 上面两个条件都满足了后,还要在Django中进行配置。

配置方法:

  • 根据你安装的Python依赖库不同,将CACHES的BACKEND设置为django.core.cache.backends.memcached.MemcachedCache或者django.core.cache.backends.memcached.PyLibMCCache
  • 设置LOCATION为你的Memecached守护进程所在的主机IP和进程端口,格式为ip:port的字符串。或者unix:path的形式,在Unix操作系统中。

下面是一个参考例子,Memcached运行在localhost (127.0.0.1) port 11211,使用了python-memcached库:

  1.  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

下面的Memcached运行在本地的Unix socket上:/tmp/memcached.sock,依赖python-memcached

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
  4. 'LOCATION': 'unix:/tmp/memcached.sock',
  5. }
  6. }
 

1

  • 2
  • 3
  • 4
  • 5
  • 6

下面的Memcached运行在/tmp/memcached.sock,不带unix:/前缀,依赖pylibmc库:

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
  4. 'LOCATION': '/tmp/memcached.sock',
  5. }
  6. }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Memcached支持分布式服务,可能同时在几台机器上运行,将它们的IP地址都加入到LOCATION中,如下所示:

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
  4. 'LOCATION': [
  5. '172.19.26.240:11211',
  6. '172.19.26.242:21423',
  7. '172.19.26.244:11213',
  8. ]
  9. }
  10. }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

基于内存的缓存系统有个明显的缺点就是断电数据丢失,尤其是Memcached这种不支持序列化的缓存,所以请大家务必要注意数据的安全性。

其实对于当下,redis如日中天的时代,还是选择redis作为缓存吧,还支持序列化。

2. 数据库缓存

我们使用缓存的很大原因就是要减少数据库的操作,如果将缓存又存到数据库,岂不是脱…

所以,尽量不要使用基于数据库的缓存,这里也不做具体介绍,给个简单的配置范例吧:

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
  4. 'LOCATION': 'my_cache_table',
  5. }
  6. }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

redis缓存

  • 准备软件:redis数据库、django-redis模块
  • 开始使用:
  • 安装:pip install django-redis
  • 配置:settings.py
  1. CACHES = {
  2. "default": {
  3. "BACKEND": "django_redis.cache.RedisCache",
  4. "LOCATION": "redis://127.0.0.1:6379/1",
  5. "OPTIONS": {
  6. "CLIENT_CLASS": "django_redis.client.DefaultClient",
  7. }
  8. }
  9. }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

但是在某些情况下,还是有一些用途的,比如你有一个高速、高效索引的数据库。

3. 文件系统缓存

连数据库我们都觉得慢,那么基于文件系统的呢?更慢!不过在你手里没有Redis、Memcached和数据库的时候,也可以勉为其难的用一下。下面给出两个配置案例:

基于Unix系统:

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
  4. 'LOCATION': '/var/tmp/django_cache',
  5. }
  6. }
 

基于Windows操作系统,需要带盘符路径:

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
  4. 'LOCATION': 'c:/foo/bar',
  5. }
  6. }
 

4. 基于本地内存的缓存

如果你的本地主机内存够大够快,也可以直接使用它作为缓存。配置如下:

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
  4. 'LOCATION': 'unique-snowflake',
  5. }
  6. }
 

5. 开发用的缓存

Django很贴心的为我们设计了一个开发用的缓存。当你的生产环境是个大型的缓存系统,而你在开发的时候又没有相应的缓存系统支持,或者不想用那种笨重的大家伙进行开发。但实际开发过程中,你又不得不接入缓存系统,使用缓存的api,这种情况下,开发用的缓存就很顺手了。

配置如下:

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
  4. }
  5. }
 

6. 自定义缓存后端

最高境界当然是使用自己开发的缓存系统了,Django是支持的,但前提是你要有那能力!配置很简单:

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'path.to.backend',
  4. }
  5. }
 

7. 缓存参数

上述每一个缓存后端都可以设置一些额外的参数来控制缓存行为,可以设置的参数如下:

  • TIMEOUT

缓存的默认过期时间,以秒为单位,默认是300秒None表示永远不会过期。设置成0将造成缓存立即失效(缓存就没有意义了)。

  • OPTIONS

可选参数,根据缓存后端的不同而不同。

  • KEY_PREFIX

Django服务器使用的所有缓存键的字符串。

  • VERSION

由Django服务器生成的默认版本号。

  • KEY_FUNCTION

一个字符串,其中包含一个函数的点路径,该函数定义了如何将前缀,版本和密钥组合成最终缓存密钥。

下面例子中配置了一个基于文件系统的缓存后端,缓存过期时间被设置为60秒,最大条目为1000.

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
  4. 'LOCATION': '/var/tmp/django_cache',
  5. 'TIMEOUT': 60,
  6. 'OPTIONS': {
  7. 'MAX_ENTRIES': 1000
  8. }
  9. }
  10. }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

以下示例配置了一个基于python-memcached库的后端,其对象大小限制为2MB:

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
  4. 'LOCATION': '127.0.0.1:11211',
  5. 'OPTIONS': {
  6. 'server_max_value_length': 1024 * 1024 * 2,
  7. }
  8. }
  9. }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

以下是基于pylibmc库的后端配置,该后端启用二进制协议、SASL认证和ketama行为模式:

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
  4. 'LOCATION': '127.0.0.1:11211',
  5. 'OPTIONS': {
  6. 'binary': True,
  7. 'username': 'user',
  8. 'password': 'pass',
  9. 'behaviors': {
  10. 'ketama': True,
  11. }
  12. }
  13. }
  14. }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

二、缓存全站

缓存系统最简单的使用方法是缓存整个网站。

这需要额外将’django.middleware.cache.UpdateCacheMiddleware’和’django.middleware.cache.FetchFromCacheMiddleware’添加到MIDDLEWARE设置中,如下所示:

  1. MIDDLEWARE = [
  2. 'django.middleware.cache.UpdateCacheMiddleware',
  3. 'django.middleware.common.CommonMiddleware',
  4. 'django.middleware.cache.FetchFromCacheMiddleware',
  5. ]
 
  • 1
  • 2
  • 3
  • 4
  • 5

注意: update中间件必须放在列表的开始位置,而fectch中间件,必须放在最后。 这是Django使用中间件的规则,它们是有顺序关系的。

然后,添加下面这些需要的参数到settings文件里:

  1. CACHE_MIDDLEWARE_ALIAS : 用于存储的缓存的别名
  2. CACHE_MIDDLEWARE_SECONDS : 每个page需要被缓存多少秒.
  3. CACHE_MIDDLEWARE_KEY_PREFIX : 密钥前缀
 
  • 1
  • 2
  • 3

三、缓存视图

另一个使用缓存框架的方法是对视图的输出进行缓存。在django.views.decorators.cache定义了一个自动缓存视图响应结果的装饰器cache_page,使用非常简单:

  1. from django.views.decorators.cache import cache_page
  2. @cache_page(60 * 15)
  3. def my_view(request):
  4. ...
 
  • 1
  • 2
  • 3
  • 4
  • 5

cache_page接受一个参数:timeout,秒为单位。在上例中,my_view()视图的结果将被缓存15分钟(为了提高可读性写成了60 * 15)

和站点缓存一样,视图缓存与URL无关。如果多个URL指向同一视图,每个URL将会分别缓存。 继续my_view的例子,如果URLconf如下所示:

  1. urlpatterns = [
  2. url(r'^foo/([0-9]{1,2})/$', my_view),
  3. ]
 
  • 1
  • 2
  • 3

那么发送到/foo/23//foo/1/的请求会被分别缓存。但是一旦一个明确的URL(例如/foo/23/) 已经被请求过了, 之后再度发出的指向该URL的请求将使用缓存的内容。

cache_page装his起也可以使用一些额外的参数,比如cache,这个参数指示具体使用的缓存后端。

  1. @cache_page(60 * 15, cache="special_cache")
  2. def my_view(request):
  3. ...
 
  • 1
  • 2
  • 3

还可以采用可选的关键字参数key_prefix在每个视图中指定具体的缓存前缀,如下所示:

  1. @cache_page(60 * 15, key_prefix="site1")
  2. def my_view(request):
  3. ...
 
  • 1
  • 2
  • 3

四、缓存模板片段

我们还可以使用cache模板标签来缓存模板的一个片段。要使用这个标签,首先要在模版的顶部位置添加{% load cache %}

模板标签{% cache %}将在设定的时间内,缓存标签块中包含的内容。它最少需要两个参数:缓存时间(以秒为单位)以及给缓存片段起的名称。像这样:

  1. {% load cache %}
  2. {% cache 500 sidebar %}
  3. .. sidebar ..
  4. {% endcache %}
 
  • 1
  • 2
  • 3
  • 4

还可以依据片段内的动态内容缓存多个版本。如上个例子中,可以给站点的每个用户生成不同版本的sidebar缓存。 只需要给{% cache %}标签再传递一个参数来标识区分这个缓存片段,如下所示:

  1. {% load cache %}
  2. {% cache 500 sidebar request.user.username %}
  3. .. sidebar for logged in user ..
  4. {% endcache %}
 
  • 1
  • 2
  • 3
  • 4

缓存超时参数可以是个模板变量,只要模板变量可以解析为整数值即可。例如,如果模板变量my_timeout设置为值600,则以下两个示例是等效的:

  1. {% cache 600 sidebar %} ... {% endcache %}
  2. {% cache my_timeout sidebar %} ... {% endcache %}
 
  • 1
  • 2

django缓存相关的更多相关文章

  1. Django的contenttypes应用、缓存相关

    一.django的contenttypes contenttypes 是Django内置的一个应用 , 可以追踪项目中所有app 和 model 的对应关系, 并记录djang_content_typ ...

  2. Django 模板相关

    Django 模板相关 视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面.目前市面上有非常多的模板系统,其中最 ...

  3. 15:django 缓存架构

    动态网站的一个基本权衡就是他们是动态的,每次一个用户请求一个页面,web服务器进行各种各样的计算-从数据库查询到模板渲染到业务逻辑-从而生成站点访问者看到的页面.从处理开销的角度来看,相比标准的从文件 ...

  4. Django—— 缓存框架

    译者注:1.无用的,吹嘘的说辞不翻译:2.意译,很多地方不准确. 动态网站最为重要的一点就是好,网页是动态的.每一次用户请求页面,网站就要进行各种计算——从数据库查询,到render模板,到各种逻辑运 ...

  5. contenttype应用 , 缓存相关

    一. Django的contenttypes contenttypes 是Django内置的一个应用,可以追踪项目中所有 app和model 的对应关系,并记录在 django_content_typ ...

  6. Django缓存使用方法

    Django缓存分为Session和Cookie:Session为放在服务器端的缓存:Cookie为放在客户端(浏览器)的缓存. Session一般用来保存登录会话:Cookie一般用来保存一些个性化 ...

  7. 浏览器缓存相关http头

    近期看雅虎黄金34条,学习下优化站点性能的方法. 当中有一条:"为文件头指定Expires或Cache-Control",详细来说指对于静态内容:设置文件头过期时间Expires的 ...

  8. Django 缓存系统

    Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多. 缓存系统工 ...

  9. 《前端之路》之 Cookie && localStorage && Session Storage 缓存相关

    08: Cookie && localStorage && Session Storage 缓存相关 客户端.前端 存储 一. 起 因 首先解释下为什么想来写这个关于前 ...

随机推荐

  1. KVC and Scalar

    https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/KeyValueCoding/DataTypes. ...

  2. abp radio表单元素 消失了

    框架将原本的元素都隐藏掉了,取而代之的是根据label定义了自己的样式,如下: [type="radio"]:not(:checked)+label {    padding-le ...

  3. iis webapi不间隔第一次访问超慢

    第一种尝试(正在验证是否有效): 设置网站对应的应用程序池的"闲置超时"为0.如下图所示

  4. python--简单的文件断点续传实例

    一.程序说明 1.文件上传目标路径:home/file 2.目标文件:putfile.png 3.服务端代码:put_server.py 4.客户端代码:put_client.py 二.各部分代码 1 ...

  5. 小程序SetData

  6. JQuery的Ajax标准写法

    Ajax的标准写法 $.ajax({ url:"http://www.xxx",//请求的url地址 dataType:"json",//返回的格式为json ...

  7. ubuntu17.10 源

    1.保险做法先备份源文件:  cp -i /etc/apt/sources.list /etc/apt/sources.list_backup 2.打开sources.list:   sudo ged ...

  8. MyBatis(九):Mybatis Java API批量操作(增、删、改、查)

    最近工作中用到了mybatis的Java API方式进行开发,顺便也整理下该功能的用法,接下来会针对基本部分进行学习: 1)Java API处理一对多.多对一的用法: 2)增.删.改.查的用法: 3) ...

  9. Mysql:设置主键自动增长起始值

    比较郁闷昨天在家使用‘alter table `tablename` AUTO_INCREMENT=10000;’怎么也不起效,但是今天下班时间公司一同事尝试了一下就可以了.搞不明白自己当时是怎么操作 ...

  10. pm2使用 node 进程管理

    1.问题 使用阿里云服务器时遇到一个问题,就是只能开一个命令窗口,加入运行node服务,只能起一个服务,不能启多个服务.pm2可以解决这个问题. 2.pm2简介 官网:https://pm2.keym ...