zoukankan      html  css  js  c++  java
  • django加缓存

    参考:https://blog.csdn.net/weixin_42134789/article/details/81283167

    https://blog.csdn.net/weixin_42134789/article/details/81283167

    https://docs.djangoproject.com/zh-hans/3.2/topics/cache/#django.views.decorators.cache.cache_page

    https://www.cnblogs.com/sss4/p/7563423.html

    https://www.cnblogs.com/sui776265233/p/9900954.html

    作为python的主流web框架,当你疑惑它是否能像java那也支持高并发的时候,有一个疑惑肯定会产生,django是否支持缓存?

    答案是肯定的!

    Django 自带强大的缓存系统,可以让你保存动态页面,这样就不必为每次请求计算。为了方便,Django 提供了不同级别的缓存粒度。你可以缓存特定视图的输出,你可以只缓存难以生成的部分,或者你可以缓存整个网站。

    一、设置缓存

    1.1.数据库缓存

    Django 可以在数据库中存储缓存数据。如果你有一个快速、索引正常的数据库服务器,这种缓存效果最好。

    用数据库表作为你的缓存后端:

    • 将 BACKEND 设置为 django.core.cache.backends.db.DatabaseCache
    • 将 LOCATION 设置为数据库表的 tablename。这个表名可以是没有使用过的任何符合要求的名称。

    在这个例子中,缓存表的名称是 my_cache_table :

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

    1.2.创建缓存表

    使用数据库缓存之前,必须通过下面的命令创建缓存表:

    python manage.py createcachetable

    2.1.文件系统缓存

    基于文件的后端序列化并保存每个缓存值作为单独的文件。要使用此后端,可将 BACKEND 设置为 "django.core.cache.backends.filebased.FileBasedCache" 并将 LOCATION 设置为一个合适的路径。比如,在 /var/tmp/django_cache 存储缓存数据,使用以下配置:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
            'LOCATION': '/var/tmp/django_cache',
        }
    }

    3.1.本地内存缓存

    如果你的配置文件中没有指定其他缓存,那么这是默认的缓存。如果你想获得内存缓存的速度优势,但又不具备运行 Memcached 的能力,可以考虑使用本地内存缓存后端。这个缓存是每进程所有(见下文)和线程安全的。要使用它,可以将 BACKEND 设置为 "django.core.cache.backends.locmem.LocMemCache"。例如:

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

    LOCATION 被用于标识各个内存存储。如果只有一个 locmem 缓存,你可以忽略 LOCATION 。但是如果你有多个本地内存缓存,那么你至少要为其中一个起个名字,以便将它们区分开。

    这种缓存使用最近最少使用(LRU)的淘汰策略。

    请注意,每个进程都会有自己的私有缓存实例,这意味着不可能进行跨进程缓存。这也意味着本地内存缓存的内存效率不是特别高,所以对于生产环境来说,它可能不是一个好的选择。对于开发来说是不错的选择。

    这将在数据库中创建一个表,该表的格式与 Django 数据库缓存系统期望的一致。该表的表名取自 LOCATION 

    二、缓存参数

    每个缓存后端可以通过额外的参数来控制缓存行为。这些参数在 CACHES 配置中作为附加键提供。有效参数如下:

    • TIMEOUT :缓存的默认超时时间,以秒为单位。这个参数默认为 300 秒(5 分钟)。你可以将 TIMEOUT 设置为 None,这样,默认情况下,缓存键永远不会过期。值为 0 会导致键立即过期(实际上是 “不缓存”)。

    • OPTIONS :任何应该传递给缓存后端的选项。有效的选项列表会随着每个后端而变化,由第三方库支持的缓存后端会直接将其选项传递给底层缓存库。

      实施自有缓存策略的缓存后端(即 locmemfilesystem 和 database 后端)将尊重以下选项:

      • MAX_ENTRIES :删除旧值之前允许缓存的最大条目。默认是 300 。

      • CULL_FREQUENCY :当达到 MAX_ENTRIES 时,被删除的条目的比例。实际比例是 CULL_FREQUENCY,所以将 CULL_FREQUENCY 设置为 2,即当达到 MAX_ENTRIES 时将删除一半的条目。这个参数应该是一个整数,默认为 3

        CULL_FREQUENCY 的值为 0 意味着当达到 MAX_ENTRIES 时,整个缓存将被转储。在某些后端(特别是 database ),这使得缓存速度  快,但代价是缓存未命中更多。

      Memcached 后端将 OPTIONS 的内容作为关键字参数传递给客户端构造函数,允许对客户端行为进行更高级的控制。具体用法请看下文。

    • KEY_PREFIX。一个自动包含在 Django 服务器使用的所有缓存键中的字符串(默认为前缀)。

      查看 缓存文档 获取更多信息。

    • VERSION :Django 服务器生成的缓存键的默认版本号。

      查看 缓存文档 获取更多信息。

    • KEY_FUNCTION 一个字符串,包含一个函数的点分隔路径,该函数定义了如何将前缀、版本和键组成一个最终的缓存键。

      查看 缓存文档 获取更多信息。

    在本例中,正在配置一个文件系统后端,超时为 60 秒,最大容量 1000 项:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
            'LOCATION': '/var/tmp/django_cache',
            'TIMEOUT': 60,
            'OPTIONS': {
                'MAX_ENTRIES': 1000
            }
        }
    }

    三、视图缓存

    django.views.decorators.cache.cache_page()

    使用缓存框架的通用办法是缓存视图结果。django.views.decorators.cache 定义了一个 cache_page 装饰器,它将自动缓存视图的响应:

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

    cache_page 使用了一个单独的参数:缓存过期时间,以秒为单位。在上面的例子里,my_view() 视图的结果将缓存15分钟。(注意,我们用 60 15 这样的方式编写,目的是方便阅读。 60 15 将计算为 900,也就是15分钟乘以每分钟60秒。)

    cache_page 设置的缓存超时优先于 Cache-Control 头中的 ``max-age'' 指令。

    和缓存站点一样,对视图缓存,以 URL 为键。如果许多 URL 指向相同的视图,每个 URL 将被单独缓存。继续以 my_view 为例,如果你的 URLconf 是这样的:

    urlpatterns = [
        path('foo/<int:code>/', my_view),
    ]

    那么 /foo/1/ 和 /foo/23/ 的请求将被分别缓存,正如你所料。但一旦部分 URL (比如 /foo/23/ )已经被请求,那么随后的请求都将使用缓存。

    cache_page 也可以传递可选关键字参数 cache,它指引装饰器在缓存视图结果时使用特定的缓存(来自 CACHES 设置)。默认情况下,将使用默认缓存,但你可以指定任何你想要的缓存:

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

    你可以基于每个视图覆盖缓存前缀。cache_page 传递了一个可选关键字参数 key_prefix ,它的工作方式与中间件的 CACHE_MIDDLEWARE_KEY_PREFIX 相同。可以这样使用它:

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

    key_prefix 和 cache 参数可能需要被一起指定。key_prefix 参数和 CACHES 下指定的 KEY_PREFIX 将被连接起来。

    此外, cache_page 在响应中自动设置 Cache-Control 和 Expires 头, 这会影响 下游缓存.

  • 相关阅读:
    在select标签中添加a标签
    js实现input的赋值
    JS截取字符串方法实例
    javascript中onclick(this)用法和onclick(this.value)用法介绍
    cookie的设置与销毁
    Js添加、读取、删除cookie,判断cookie是否有效,指定domain域下主路径path下设置cookie,设置expires过期时间
    自然语言处理的神经网络模型初探
    [Android] Toast问题深度剖析(二)
    如何使用 scikit-learn 为机器学习准备文本数据
    Android图像处理
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15750355.html
Copyright © 2011-2022 走看看