Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第十二章:django性能优化 > 12.1节:缓存框架的配置与使用

12.1节:缓存框架的配置与使用

薯条老师 2020-10-14 07:50:42 234297 0

编辑 收藏

系统地讲解Django开发的基础知识, 高级知识。关注公众号[薯条编程],领取该教程的PDF电子书:《Python web开发-Django从入门到项目实战》。

12.1.1 使用缓存提升程序性能

在计算机系统中,缓存是一种很重要的性能优化手段。以CPU计算为例,程序中的数据保存在内存中,CPU在执行计算前,先从内存中读取数据,通过将频繁访问的数据缓存在高速缓存中,当下次进行数据读取时,先从高速缓存中查找,这样会大大提升数据读取的性能。

django提供了一套缓存框架,通过该缓存框架,可以对站点,视图,模板进行缓存控制。在开发django应用时,合理地使用缓存框架,可以开发出高性能的django应用。

12.1.2 在项目中配置缓存框架

django内置的缓存框架提供了四种方式来对数据进行缓存:

基于内存组件的缓存,基于数据库的缓存,基于文件系统的缓存,以及应用内的本地缓存。

在应用中不论使用何种缓存方式,都要在settings.py中进行配置。与缓存配置相关的全局变量为CACHES。CACHES变量的配置举例:

CACHES = {
    # default表示配置默认的缓存实例
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        'TIMEOUT': 60,
        'OPTIONS': {
            'MAX_ENTRIES': 1000
        }
    }
}

CACHES字典的主要配置参数:

参数名

描述

BACKEND

表示后端使用的缓存类型

LOCATION

表示缓存的位置或标识

TIMEOUT

表示缓存的有效期,单位为秒,默认为300秒,设置为None时表示永不过期。

OPTIONS

表示缓存的可选参数,OPTIONS中的主要参数为:MAX_ENTRIESCULL_FREQUENCY

MAX_ENTRIES表示缓存的最大条目,默认为300。

CULL_FREQUENCY表示超出最大缓存条目时,缓存删除的比例,默认为3。比例的计算公式为1/CULL_FREQUENCY。

例如CULL_FREQUENCY为2,则表示删除1/2的缓存。CULL_FREQUENCY为0时,表示清空所有缓存。

(1) 基于内存组件的缓存配置

Memcached是一个完全基于内存的缓存服务器,在django中使用Memcached作为缓存组件,需要先安装并运行Memcached。

在django中配置Memcahced作为缓存:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        
        # LOCATION参数填写memcached服务器的地址和端口,也可以通过Unix socket等方式来配置LOCATION的值
        'LOCATION': '127.0.0.1:11211'
    }
}

Memcached有一个很卓越的分布式特性,支持在多个Memcached服务器之间共享缓存。

在django中配置多个Memcached服务器:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        # LOCATION为一个列表类型
        'LOCATION': ['172.19.26.240:11211','172.19.26.241:11211']
    }
}

(2) 基于数据库的缓存配置

使用基于数据库的缓存时,需要将BACKEND设置为:

django.core.cache.backends.db.DatabaseCache

以及将LOCATION设置为数据库的表名。在django中配置数据库作为缓存:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table'
    }
}

配置完成后还需要在数据库中创建缓存数据表来对数据进行缓存,缓存数据表的表名为LOCATION中设置的表名,创建缓存数据表的命令为:

python manage.py createcachetable

在django中配置了多个数据库时,缓存数据表会对同时对多个数据库中的数据进行缓存。

(3) 基于文件系统的缓存配置

使用基于文件系统的缓存时,需要将BACKEND设置为:

django.core.cache.backends.filebased.FileBasedCache

以及将LOCATION设置为缓存的目录路径。在django中使用文件系统来作为缓存的配置实例:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
         # 如果系统为windows,缓存的目录必须存在,且服务器有权限在目录中进行读写操作
        'LOCATION': 'D:/cache/django-cache'
                
                # 类Unix系统的目录路径
         # 'LOCATION': '/var/tmp/django_cache'
    }
}

(4) 基于应用内的本地缓存配置

django的默认缓存配置为应用内的本地缓存,这点不同于Memcached,Memcached是一个独立的缓存服务器,而应用内的本地缓存是django服务器内的缓存。使用本地缓存时,需要将BACKEND设置为:

django.core.cache.backends.locmem.LocMemCache

以及将LOCATION设置为一个唯一的标识值,当程序中仅使用一个本地缓存时,无需对LOCATION进行配置。在django中使用本地缓存:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        # 设置一个唯一的标识值
        'LOCATION': 'unique-cache-for-django'
        }
}

12.1.3 对站点,视图,模板进行缓存

(1) 对站点进行缓存

在项目中使用缓存,最简单的方式是对整个站点进行缓存。对站点进行缓存,需要在settings.py中进行配置。首先是配置缓存中间件,与中间件配置的全局变量为MIDDLEWARE,在MIDDLEWARE列表中分别添加django.middleware.cache.UpdateCacheMiddlewardjango.middleware.cache.FetchFromCacheMiddleware:

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware'
]

然后配置缓存的别名,有效期,键名前缀:

CACHE_MIDDLEWARE_ALIAS :为缓存指定一个别名。

CACHE_MIDDLEWARE_SECONDS:为每个缓存的页面指定一个有效期,单位为秒 。

CACHE_MIDDLEWARE_KEY_PREFIX:当缓存为多个站点共享时,设置一个唯一的键名前缀,可以防止键名冲突。

(2) 对视图进行缓存

使用cache_page对函数视图进行装饰,cache_page的参数为缓存的有效期(单位为秒)。cache_page的用法举例:

from django.views.decorators.cache import cache_page

# 对视图缓存15分钟 
@cache_page(60 * 15)
def my_view(request):
    pass

cache_page装饰器还定义了另外的两个关键字参数:cache与key_prefix。cache用来指定在项目配置文件CACHES变量中所定义的缓存方式,key_prefix用来定义缓存中的键名的前缀。cache_page也可以用于URL的配置文件中:

from django.views.decorators.cache import cache_page
urlpatterns = [
    path('cache_test/', cache_page(60 * 15)(my_view)),
]

(3) 对模板进行分段缓存

如需对页面缓存进行更精细的控制,可以在模板中使用分段缓存。使用分段缓存,需要在模板的头部加上一行{% load cache %}的模板标签。然后使用模板标签{% cache %}来进行分段缓存。模板标签{% cache %}的主要参数:

参数名

描述

timeout

必传参数,表示缓存的有效期,单位为秒

fragment_name

必传参数,分段缓存的名称

unique

可选参数,分段缓存的唯一标识,可以通过该唯一标识来进行缓存控制,例如对不同的用户使用不同的缓存

using

可选的关键字参数,配置模板缓存使用的缓存实例

对模板进行分段缓存的代码实例:

{% load cache %}
{# 对sidebar缓存500秒 #}
{% cache 500 sidebar %}
<div></div>
{% endcache %}
 
{# 根据不同的用户来对sidebar进行缓存 #}
{% cache 500 sidebar request.user.username %}
<div></div>
{% endcache %}
 
 
{# cache标签默认使用名为template_fragments的缓存,如果不存在,会使用默认缓存  #}
{# 通过using参数来指定一个缓存实例  #}
{# 该缓存实例在CACHES变量中进行配置  #}
 
{% cache 500 sidebar request.user.username using="localcache" %}
<div></div>
{% endcache %}

关注微信公众号:薯条编程,公众号后台回复"Python资料",免费领取Python电子书,以及学习Python视频课程。

小班授课,薯条老师一对一教学,火热报名中,点击了解线下就业培训。



欢迎 发表评论: