Code前端首页关于Code前端联系我们

Django缓存使用详解:如何正确设置?

terry 2年前 (2023-09-24) 阅读数 71 #后端开发

Django 缓存用法详解:如何正确的配置?

缓存(Cache)对于创建成功的网站和改善用户体验❀非常重要。不过,对于我们这样的人来说,我们是可以负担得起的。对于码农来说最重要的是学会如何使用缓存。今天我们来看看缓存的实现场景和工作原理,并详细介绍如何在Django中设置缓存并使用它们。

什么是缓存

缓存是任何类型的介质的总称,可以更快地读取数据。还指其他可以加快数据读取速度的存储方式。用于临时数据存储,最常用的设备是速度快的存储器。一般来说,多次从数据库中提取必要数据的成本比从内存或硬盘中读取一次要大得多。对于中大型网站来说,利用缓存来减少数据访问次数是提高网站性能的关键之一。

为什么要使用Cache

在Django中,当用户请求到达视图时,视图将首先从数据库中获取数据并将其作为活动订阅放入模板中。输出是用户看到的网页。如果用户从数据库获取数据并授予所有请求,性能将显着下降。不仅服务器会承受很大的压力,而且客户也无法得到即时响应。如果发布的结果能够更快地被缓存,那么每次传入请求时,首先检查缓存中是否有匹配的资源。如果有,则直接从缓存中取出并返回结果,节省了数据检索和传输的时间。时间不仅提高了系统性能,也提高了用户体验。

让我们看一个实际的博客示例。每次我们访问主页时,下面的视图都会从数据库中提取文章列表并将其复制到模板中。一般来说,我们的博客更新不频繁,所以文章列表不会变化。这样,当用户在一段时间内多次访问主页时,再次读取相同的数据是一种浪费。

from django.shortcuts import render
 
def index(request):
  # 读取数据库等并渲染到网页
  article_list = Article.objects.all()
  return render(request, 'index.html', {'article_list': article_list})

使用Cache可以帮助我们解决这个问题。当用户第一次访问博客主页时,我们从数据库中检索帖子列表并将它们存储在缓存中(通常是内存,具体取决于您的情况)。当用户在组时间内重新访问主页时,Django首先检查缓存是否已过期(本例为15分钟),然后检查文章列表资源是否存在缓存。如果存在,则直接从缓存中读取数据并渲染模板。

from django.shortcuts import render
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # 秒数,这里指缓存 15 分钟
def index(request):
  article_list = Article.objects.all()
  return render(request, 'index.html', {'article_list': article_list})
注意: 在Django中使用缓存前,我们必需先做必要的设置。

缓存应用历史记录

缓存最适合对页面性能要求不高的页面。缓存中存储的数据通常会被频繁访问,并且不会被频繁修改。让我们举一些应用示例:

  • 博客文章。假设用户每天更新帖子,那么你可以将博客缓存1天,一天后就会更新。
  • 购物网站。产品信息几乎永远不会改变,产品的购买量需要根据用户的情况实时更新。我们可能选择仅发布产品描述信息。
  • 片段网站。例如,缓存网页导航菜单和页脚(Footer)。

Django 缓存设置

Django 提供了多种缓存方式。如果要使用缓存,需要先在settings.py中配置并启用。根据缓存工具的不同,您需要设置不同的后台缓存后端。 ? 数据库缓存

  • 文件系统缓存
  • 本地内存缓存
  • 全站点缓存
  • 1.Memcached缓存是最快、最快的可用缓存之一。 Django 缓存框架原生支持。对于大多数情况,我们建议使用 Memcached,其中数据缓存在服务器端。使用前需要在pip上安装memcached插件python-memcached和pylibmc,可以同时支持多台服务器上的memcached。

    下面是使用 pyhon-memcached 的安装。

    # localhost
    CACHES = {
      'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
      }
    }
     
    # unix soket
    CACHES = {
      'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': 'unix:/tmp/memcached.sock',
      }
    }  
     
    CACHES = {
      'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
          '172.19.26.240:11211',
          '172.19.26.242:11211',
        ]
        # 我们也可以给缓存机器加权重,权重高的承担更多的请求,如下
        'LOCATION': [
          ('172.19.26.240:11211',5),
          ('172.19.26.242:11211',1),
        ]
      }
     }

    2。数据库缓存

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

    3。文件系统缓存

    CACHES = {
      'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FilebasedCache',
        'LOCATION': '/var/tmp/django_cache',#这个是文件夹的路径
        #'LOCATION': 'c:foobar',#windows下的示例
      }
    }

    4。本地内存缓存

    CACHES = {
      'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake'
      }
    }

    5。 Django 配置全站缓存方法

    settings.py 配置中间件:

    MIDDLEWARE = [
        # "django.middleware.cache.UpdateCacheMiddleware",  #全站缓存配置一,必须放在第一位 # 放页面的时候,应该放在最前面
        'django.middleware.common.CommonMiddleware',
        # "django.middleware.cache.FetchFromCacheMiddleware",  #全站缓存配置二,必须放在最后一位# 取页面放在这个位置
    ]

    值得注意的是,当你配置信息时,并不会要求你全部编辑。您可以选择以上其中一项。对于单个站点,我更喜欢本地内存缓存。

    尤其是全缓存和其他四种类型。相反,如果配置了整个缓存,则不存在其他缓存。

    如何在Django代码中使用Cache

    安装Cache后,您可以通过三种方式在代码中使用Cache。

    • 在 View 视图中使用
    • 在模板中使用

    在视图中使用缓存

    from django.views.decorators.cache import cache_page
     
    @cache_page(60 * 15)
    def my_view(request):
      ...

    在 URLConf 路径中使用缓存

    这就是我想要更新的方式。必须改变逻辑部分的负责视图。

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

    模型中使用缓存

    {% load cache %}
    {% cache 500 sidebar request.user.username %}
      .. sidebar for logged in user ..
    {% endcache %}

    对于大多数码农s来说,我们只需要知道如何在django中使用缓存即可,不需要详细了解django后端的工作原理,比如Django如何存储数据关于选择。 media 以及 django 如何确定缓存是否耗尽。

    在Django中使用缓存的高级技巧

    我来介绍一下在Django中使用缓存的一些高级技巧。

    使用cache_control

    一般来说,用户面临两个缓存:私有浏览器缓存(cache privée)和其提供者的缓存(cache public)。公共缓存被许多用户使用并由其他人控制。这会引发您不希望暴露的敏感数据的问题,例如存储在公共缓存中的银行帐号。因此,Web 应用程序需要告诉缓存哪些数据是私有的,哪些数据是公共的。

    解决方案是指定页面缓存应该是私有的。要在 Django 中执行此操作,请使用 cache_control 视图装饰器:

    from django.views.decorators.cache import cache_control
     
    @cache_control(private=True)
    def my_view(request):
    # ...

    此装饰器负责将适当的 HTTP 标头发送到域。

    还有其他方法可以控制缓存参数。例如,HTTP 允许应用程序执行以下操作:

    1. 指定页面可以缓存的最长时间。
    2. 指定缓存是否应始终检查新版本,并仅在没有更新时提供缓存内容。

    在Django中,可以使用cache_control视图指定这些缓存参数。在以下示例中,cache_control 告诉缓存在每次访问时重新验证缓存,并将缓存版本存储3600 秒。

    from django.views.decorators.cache import cache_control
     
     
    @cache_control(must_revalidate=True, max_age=3600)
    def my_view(request):
    # ...

    在cache_control()中,任何HTTP Cache-Control指令都是有效的。这是完整列表:

    • public=True
    • private=True
    • no_cache=True
    • no_transform=True
    • mu validate=True
    • max_age=isa_seconds
    • s_maxage=num_秒

    使用varie_on_headers

    默认情况下,Django的缓存系统使用请求的路径(例如blog/article/1)来生成缓存键。这意味着请求相同路径的不同用户将收到相同的缓存版本,无论客户端用户、cookie 和语言有何差异,除非您使用 Rice 标头告知缓存机制需要解析 cookie 和语言。请求头的差异。 。

    要在 Django 中执行此操作,请使用variable_on_headers 视图。例如,以下代码告诉 Django 在读取缓存数据时考虑 User-Agent 和 cookie 的差异。

    from django.views.decorators.vary import vary_on_headers
     
    @vary_on_headers('User-Agent', 'cookie')
    def my_view(request):
      ...

    使用 never_cache 禁用缓存

    如果你想完全禁用使用 headers 的缓存,你可以使用 django.views.decorators.cache.never_cache 装饰器。如果不使用视图缓存,服务器不会阻止它。但是,浏览器等用户客户端仍会保留一些数据。在这种情况下,您可以使用never_cache来清除客户端的缓存。

    from django.views.decorators.cache import never_cache
     
    @never_cache
    def myview(request):
    # ...

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门