全面指南:Django缓存 — CodesCode

学习什么是缓存,它的好处,如何在Django中设置缓存,Django支持的后端系统,以及缓存最佳实践

在本文中,您将全面了解Django和Web开发中的缓存。您将了解缓存是什么,缓存的好处,如何在Django中设置缓存,Django支持的后端系统以及缓存的最佳实践。

阅读完本文后,作为后端Web开发人员,您将对缓存有深入的了解,并且知道如何在Django项目中实现最佳性能。

Django框架是如今最受Web开发人员欢迎的后端框架之一。作为开发人员,构建高性能的Web应用程序应该是您的目标之一。因此,在Django中构建高性能的Web应用程序不应该是一件麻烦的事情,因为Django带有一个缓存框架,使您能够使用各种缓存后端,例如内存缓存,基于文件的缓存,数据库缓存等等。

Django缓存简介

缓存在Web开发中是一种由Web开发人员使用的技术,用于提高Web应用程序的性能。每个Web应用程序都拥有其用户经常希望利用的资源。一个资源可以是简单的网页,也可以是存储在数据库中的数据。缓存在最大化访问资源的速度方面起着重要作用。

常见的缓存场景和用例

Django缓存框架提供了各种场景和用例,使开发人员能够缓存经常访问的数据。以下是常见的缓存场景:

  • 页面缓存。这是一种完全缓存频繁访问的网站页面的场景。当请求发出时,应用程序会获取页面的缓存版本并呈现它们,而不是从头开始创建页面的内容。

  • 数据库查询缓存。数据库查询缓存是一个适用于频繁向数据库请求信息的应用程序的良好方法。同一份缓存数据可以满足一系列请求,而不需要访问数据库,从而降低数据库访问频率,加快服务器响应时间。

  • 会话和认证缓存。可以使用缓存来提供流畅的用户体验和更快的响应时间。由于缓存的数据可以帮助用户在应用程序的经过身份验证的部分之间轻松移动,因此缓存身份验证和会话详细信息可以减少冗余身份验证操作。

Django缓存的好处

在这个数据至关重要且速度更为重要的现代环境中,缓存对Web开发人员更加有益处。这些是一些缓存的好处:

  • 提高性能。缓存通过减少服务器负载来提升Web应用程序的性能。当服务器接收到应用程序的请求时,缓存确保一些请求使用先前缓存的数据来满足。这样可以避免服务器不得不从头开始进行这些操作。结果,用户的整体体验得到了改善,并且反应时间得到了加快。

  • 减少响应时间。缓存通过减少数据库访问次数来缩短响应时间。缓存使得数据可以从方便的位置获取,而不是每次都直接从数据库获取。由于某些数据需要昂贵的计算,可能需要一些时间才能完成,每次需要时从数据库获取数据可能并不适合所有数据的最佳选择。通过保存数据并在需要时快速提供数据,缓存拯救了一天。

  • 资源优化。在Web应用程序中缓存数据或资源,可以使资源可以被访问和检索,而无需执行输出相同资源的重复操作。

设置一个 Django 项目

本节的主要任务是创建虚拟环境并安装项目所需的模块。要创建虚拟环境,请在终端中输入以下命令:

$ python -m venv 项目名称

项目的所有模块都将安装在此环境中,所以要开始使用它,我们需要激活它。

在 Windows 下使用:

$ .\项目名称\Scripts\activate

在 macOS 或 Linux 下使用:

$ source 项目名称/bin/activate

在实现缓存之前,首先要做的是设置一个 Django 项目。因此,首先安装 Django。打开终端,运行以下命令:

$ pip install django

成功安装 Django 后,让我们创建一个 Django 项目和应用程序。执行以下命令来创建一个 Django 项目:

$ django-admin startproject 缓存项目名称

进入项目文件夹。在这里,我们将创建一个 Django 应用程序。运行以下命令:

$ cd 缓存项目名称

然后运行以下命令:

$ python manage.py startapp 缓存应用程序名称

成功创建项目和应用程序之后,我们需要将应用程序注册到项目中。打开 settings.py 文件,并将 INSTALLED_APPS 列表设置如下:

INSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    # 新增的应用程序    '缓存应用程序名称',]

注意:要在 Django 项目中使用应用程序,必须在 INSTALLED_APPS 列表中注册它。

现在,为了验证 Django 框架已成功安装,请进行测试。在终端中运行以下命令:

$ python manage.py runserver

确保您得到下面所示的输出结果。

终端输出

现在复制 URL 并粘贴到 web 浏览器中。期望的输出结果如下所示。

成功安装消息

注意:您可以在 CodesCode 上阅读更多有关快速开始 Django 项目和 Django 应用程序的内容。

在 settings.py 中配置不同的缓存设置

要使用缓存,我们需要在 Django 项目中进行配置,因此在本节中,我们将看看如何配置 Django 中提供的不同缓存系统。

本地内存缓存

如其名称所示,本地内存缓存(有时缩写为locmem)将缓存数据存储在主机机器的 RAM 中。

如果您在 settings.py 文件中没有提供其他缓存机制,Django 会自动使用本地内存缓存作为默认缓存系统。它的线程安全、快速和响应灵敏的缓存技术值得注意。

本地内存缓存不适用于生产环境,因为它包含一个进程内机制,阻止任何形式的跨进程缓存,并使每个进程都维护单独的私有缓存实例。不过,对于开发环境来说仍然是一个不错的选择。

要在应用程序中配置本地内存缓存,请在 settings.py 文件中添加以下代码:

# CACHES 字典包含缓存配置。CACHES = {    # 缓存别名或名称。在这种情况下,我们使用 "default" 作为别名。    "default": {        # 在这里,我们使用内存中的缓存后端。        "BACKEND": "django.core.cache.backends.locmem.LocMemCache",        # LOCATION 参数为此缓存实例提供一个唯一名称或标识符。        "LOCATION": "unique-snowflake",    }}

基于文件的缓存

在基于文件的缓存中,每个缓存值在缓存时被序列化并分别保存在文件中。它适用于小规模应用程序或不适合使用基于内存的缓存的场景。

这种缓存系统的缺点是相对于基于内存的缓存而言比较慢。

要在应用程序中配置基于文件的缓存,请在settings.py文件中添加以下代码:

# CACHES字典,包含缓存配置.CACHES = {    # 我们使用"default"作为别名。    "default": {        # 在这里,我们使用基于文件的缓存后端。        "BACKEND": "django.core.cache.backends.filebased.FileBasedCache",        # LOCATION参数用于指定缓存数据存储的文件系统路径。        "LOCATION": "/var/tmp/django_cache",    }}

如果你使用的是Windows,请确保在路径前加上相应的驱动器字母,如下所示:

CACHES = {    "default": {        "BACKEND": "django.core.cache.backends.filebased.FileBasedCache",        "LOCATION": "C:/my/path-to/file",    }}

数据库缓存

除了将缓存存储在文件中和托管机器的RAM中,Django还提供将缓存存储在数据库中的功能。

如果你有一个快速、具有良好索引的数据库服务器,这种方法非常适用。

要在应用程序中使用数据库缓存,请在settings.py中添加以下代码:

# CACHES字典,包含缓存配置.CACHES = {    # 我们使用"default"作为别名。    "default": {        # 在这里,我们使用基于数据库的缓存后端。        "BACKEND": "django.core.cache.backends.db.DatabaseCache",        # Provide a LOCATION parameter to specify the database table name where cached data will be stored.        "LOCATION": "my_cache_table",    }}

在使用缓存之前,请使用以下命令构建上述设置中提到的数据库表:

python manage.py createcachetable

上述命令将以Django数据库缓存系统期望的适当格式在数据库中创建一个表。表的名称取自LOCATION。在本例中,表的名称将是my_cache_table

Memcached缓存

Memcached是一种内存缓存系统,即使在一些知名公司中,也由Web开发人员用于减少数据库访问并提高站点性能。

与locmem缓存相比,Memcached作为一个守护进程运行,这意味着Memcached服务器作为后台进程独立于任何直接用户交互运行。因此,Memcached必须单独安装在您的计算机上。然后在Django应用程序中,安装并配置其绑定之一,如pylibmc或pymemcache,以使用Memcached。

可以通过添加缓存设置、位置、IP地址和其他详细信息将Django应用程序连接到Memcached守护进程,如下所示:

# 名为CACHES的字典,包含缓存配置.CACHES = {    # "default"是别名。    "default": {        # 在这里,我们使用基于Memcached的缓存后端。        "BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache",        # LOCATION参数用于指定Memcached服务器的IP地址和端口。        "LOCATION": "127.0.0.1:11211",    }}

Memcached技术特别适用于具有高读取或查询负载的应用程序,因为它设计用于快速数据存储和检索。

Memcached的缺点是,由于数据存储在内存中,如果服务器崩溃,数据将会丢失。

Redis

Redis是一个可以用于缓存的内存数据库。它使用Redis内存数据存储来进行缓存。Redis以其快速和适应性而闻名,在分布式系统和高性能缓存中是一个很好的选择。

要在应用程序中使用Redis进行缓存,你需要在本地或远程机器上运行一个Redis服务器。要在计算机上设置Redis,请阅读Redis的入门指南

在设置Redis服务器后,你需要安装Redis的Python绑定。使用以下命令进行安装:

$ pip install django-redis

redis-py接口是Django原生支持的绑定,也可以使用django-redis和redis包。

要在应用程序中配置Redis缓存,假设您的Redis服务器正在运行localhost (127.0.0.1),port=6379,请在settings.py中添加以下代码:

# 一个名为CACHES的字典,其中包含缓存配置。
CACHES = {
    # “default”是别名。
    “default”:{
        # 这里我们使用Redis缓存后端。
        “BACKEND”:“django.core.cache.backends.redis.RedisCache”,
        # LOCATION参数指定Redis服务器的地址和端口。
        “LOCATION”:“redis://127.0.0.1:6379”,
    }
}

Redis的复杂性和对外部服务的依赖是它的权衡。与某些其他缓存后端相比,Redis的安装和配置可能更为棘手。它需要一个第二个服务器,并在在线时保持维护。Redis的使用会导致对外部服务的依赖。如果Redis出现问题或停机,您的应用程序的缓存能力可能会受到影响。

使用Redis在Django中进行缓存

好的,理论部分已经讲完。在本节中,我们将演示如何在Django应用程序中进行缓存。我们将重点关注三种形式的缓存:

  • 视图缓存
  • 模板片段缓存
  • 站点缓存

但在详细介绍每种缓存形式之前,让我们首先正确设置项目。我们将创建、注册和填充模型,配置应用程序的URL,创建一个模板,安装Django调试工具栏并进行配置。

cachedapplication应用程序中,打开models.py文件,让它看起来像这样:

from django.db import models
class Programmer(models.Model):
    name = models.CharField(max_length=50)
    dob = models.CharField(max_length=20)
    language = models.CharField(max_length=20)
    quote = models.CharField(max_length=150)
    def __str__(self):
        return f"{self.name}"

接下来,打开admin.py文件,并粘贴以下代码:

from django.contrib import admin
from .models import Programmer
admin.site.register(Programmer)

此代码片段在Django管理面板中注册了模型Programmer

在填充模型之前,我们来进行一些迁移。在终端中运行以下命令:

$ python manage.py makemigrations

然后运行:

$ python manage.py migrate

在Django中,我们可以通过两种方式填充我们的模型:通过终端和通过管理面板。但为了简单起见,我们将使用管理面板。由于管理面板只针对超级用户,我们需要创建一个超级用户。在终端中运行以下命令:

$ python manage.py createsuperuser

此命令将提示您输入超级用户的详细信息,如用户名、电子邮件和两个密码。

成功创建超级用户后,启动本地服务器,在浏览器中输入此URL:http://127.0.0.1:8000/admin/。下面的图片显示了您将访问的页面。

dashboard login

要登录,请提供超级用户凭据,一旦登录成功,使用如下图片所示的数据填充模型。

the registered model in the admin interface

在应用程序中创建一个templates文件夹,并在其中创建一个 list_all.html文件。目前,将HTML文件保留为空。打开views.py文件,并将其修改为以下内容:

from django.shortcuts import render
from .models import Programmer
def home(request):
    programmers = Programmer.objects.all()
    context = {
        'programmers': programmers
    }
    return render(request, 'list_all.html', context)

现在让我们在项目的urls.py文件中注册home视图。在cachedproject文件夹中,打开urls.py文件,并粘贴以下代码:

从django.contrib导入admin
从django.urls导入path, include
从cachedapplication导入views
urlpatterns = [
    path('admin/', admin.site.urls),
    # 从cachedapplication中获得的主页视图
    path('home/', views.home, name='home'),
]

现在打开list_all.html文件并粘贴以下代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>缓存</title>    <link href="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/6.4.2/mdb.min.css" rel="stylesheet"/></head><body>    <div class="container py-5">        <table class="table">           <thead>              <tr>                 <th>名字</th>                 <th>出生日期</th>                 <th>语言</th>                 <th>引用</th>              </tr>           </thead>           <tbody>              {% for programmer in programmers %}              <tr>                 <td>{{programmer.name}}</td>                 <td>{{programmer.dob}}</td>                 <td>{{programmer.language}}</td>                 <td>{{programmer.quote}}</td>              </tr>              {% endfor %}           </tbody>        </table>     </div></body></html>

让我们安装一个Django调试工具栏。这是一个帮助开发人员监控其Django应用程序性能的Python包,提供有关数据库查询、HTTP请求、模板渲染时间等详细信息。因此,在终端中输入以下命令:

pip install django-debug-toolbar

要配置django-debug-toolbar,打开settings.py文件并将INSTALLED_APPS列表修改为以下内容:

# 应用程序定义
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 添加新应用程序
    'cachedapplication',
    # 调试工具栏
    'debug_toolbar',
]

将调试工具栏添加到MIDDLEWARE列表中:

MIDDLEWARE = [
    # 调试工具栏中间件
    'debug_toolbar.middleware.DebugToolbarMiddleware',
]

将调试工具栏中间件放在这行代码之后:

django.middleware.csrf.CsrfViewMiddleware

它还应该位于这行代码之前:

django.contrib.auth.middleware.AuthenticationMiddleware

按照以下方式添加Redis缓存配置:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

还要将以下代码添加到settings.py文件中:

INTERNAL_IPS = [
    # ...
    '127.0.0.1',  # 添加你的开发机IP地址在这里
]

最后,在urls.py文件中配置调试工具栏的URL。在导入语句下面添加以下代码:

import debug_toolbar

urlpatterns列表中添加以下代码:

urlpatterns = [
    # 调试工具栏URL
    path('__debug__/', include(debug_toolbar.urls)),
]

到目前为止,我们已经准备就绪。启动服务器并将以下URL粘贴到浏览器中:http://127.0.0.1:8000/home/。下面的图片显示了我们得到的页面。

调试工具栏

每当使用此视图运行应用程序时,都会进行SQL查询。在这种情况下,已经进行了三个查询,耗时2.60毫秒。为了避免每次都为相同数据进行SQL查询,我们将实现视图缓存。

视图缓存

顾名思义,视图缓存是将Django视图的结果缓存起来。在本节中,我们将实现视图缓存。为此,我们将对view.py文件进行一些修改。打开文件并添加以下导入语句:

from django.views.decorators.cache import cache_page

在视图上方,还要添加这个装饰器:

@cache_page(60*15)

(60*15) 是传递给@cache_page的参数。它表示缓存超时时间(以秒为单位)。主页视图将被缓存15分钟。

现在访问相同视图并刷新页面。我们将得到下面的结果。

零个SQL查询

从以上图像中,我们可以看到已经没有进行任何SQL查询,因为数据是从缓存获取的。这有助于通过向用户提供缓存内容来减轻服务器负载。

模板片段缓存

模板片段缓存涉及缓存项目模板中的特定部分。当模板中的某些部分具有繁重的计算时,模板片段缓存非常有用。要实现此缓存,我们使用以下标签:{% load cache %}{% cache %}{% endcache %}{% cache %}标签接受两个参数:缓存超时时间和用于标识特定缓存片段的唯一缓存键。

在实现此缓存技术之前,现在尝试运行项目。下图显示了我们将获得的结果。

时间设置

总时间是220.26毫秒,执行了三个SQL查询,共需7.75毫秒。

现在,让我们实施缓存技术。我们将对模板的<div>部分进行缓存。打开templates/list_all.html,并将其修改为以下内容:

{% load cache %}<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>缓存</title>    <link href="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/6.4.2/mdb.min.css" rel="stylesheet"/></head><body>     {% cache 500 programmers %}    <div class="container py-5">        <table class="table">           <thead>              <tr>                 <th>姓名</th>                 <th>出生日期</th>                 <th>语言</th>                 <th>名言</th>              </tr>           </thead>           <tbody>              {% for programmer in programmers %}              <tr>                 <td>{{programmer.name}}</td>                 <td>{{programmer.dob}}</td>                 <td>{{programmer.language}}</td>                 <td>{{programmer.quote}}</td>              </tr>              {% endfor %}           </tbody>        </table>     </div>   {% endcache %}</body></html>

在文件顶部,我们通过{% load cache %}加载缓存,并使用{% cache 500 programmers %}{% endcache %}包围了<div>部分。

如果您再次运行这个项目,您将会得到如下所示的结果。

更好的缓存结果:时间 68.14 毫秒,2个查询在 2.13 毫秒内

从上面的图片中,我们可以看到在实施缓存后,结果有所改善。

站点缓存

站点缓存也被称为整站缓存,它涉及缓存整个网站的页面。要实施它,您需要在settings.py文件中添加以下中间件配置:

MIDDLEWARE = [    # …    'django.middleware.cache.UpdateCacheMiddleware',    'django.middleware.common.CommonMiddleware',    'django.middleware.cache.FetchFromCacheMiddleware',    # …]

还要添加以下这些行:

CACHE_MIDDLEWARE_ALIAS  = ' ' # 缓存别名CACHE_MIDDLEWARE_SECONDS = 600 # 每个页面应该被缓存的秒数CACHE_MIDDLEWARE_KEY_PREFIX = ''  # 如果使用多个站点,站点名称

总结

总之,对于希望创建高性能 web 应用程序的 web 开发人员来说,了解 Django 中的缓存是至关重要的。本文提供了关于 Django 中缓存的全面指南,包括缓存的好处、在 Django 中设置缓存以及最佳实践。凭借这些知识,后端 web 开发人员可以自信地将缓存纳入到他们的 Django 项目中以优化性能。

如果您喜欢这篇文章,请在 CodesCode 上查看更多Django 文章

分享本文


Leave a Reply

Your email address will not be published. Required fields are marked *