• Django缓存机制


    一、缓存介绍

    在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增、删、查、改、渲染模板、执行业务逻辑,最后生成用户看到的页面。

    当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力。

    缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。

    二、缓存位置的配置

    在setting中配置CACHES,配置在连接数据库的下面,BACKEND不同,缓存的位置不同:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',  # 指定缓存使用的引擎
            'LOCATION': 'E:django_huancuncache',  # 指定缓存的路径
            'TIMEOUT': 300,        # 缓存超时时间(默认为300秒,None表示永不过期)
            'OPTIONS': {
                'MAX_ENTRIES': 300,    # 最大缓存记录的数量(默认300)
                'CULL_FREQUENCY': 3,   # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
            }
        }
    }

     

    三、缓存粒度

    单页面缓存

    局部缓存

    全站缓存

    四、缓存的使用

    配置setting文件,把CACHES配置进去

    1、单页面缓存

    在视图函数上加一个装饰器

    import time
    from django.views.decorators.cache import cache_page
    @cache_page(
    5) # 5代表缓存时间, 装饰过后,每五秒缓存时间 def index(request): now_time = time.time() return render(request, 'index.html', locals())

    2、局部缓存

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    {% load cache %}
    
    {{ now_time }}
    
    <br>
    {# 第一个参数表示缓存时间,第二个参数是key值(取缓存的时候,需要根据key值取)#}
    {% cache 5 'test' %}
    
    当前时间:{{ now_time }}
    {% endcache %}
    
    
    </body>
    </html>

    3、全站缓存

    既然是全站缓存,当然要使用Django中的中间件。

    用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户。

    当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存。

    在settings里配置

    # 缓存整个站点,是最简单的缓存方法
    # 在MIDDLEWARE_CLASSES中加入update和fetch中间件
    # update 必须配置在第一个
    # fetch 必须配置在最后一个
    MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',  # 响应HttpResponse中设置几个headers
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'django.middleware.cache.FetchFromCacheMiddleware',  # 用来缓存通过GET和HEAD方法获取的状态码为200的响应
    
    ]
    # 缓存时间5秒
    CACHE_MIDDLEWARE_SECONDS = 5

    views.py

    from django.shortcuts import render
    import time
    
    def index(request):
        now_time = time.time()
        return render(request, 'index.html', locals())

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    
    </head>
    <body>
    
    {{ now_time }}
    
    </body>
    </html>

    刷新浏览器是5秒,页面上的时间变化一次,这样就实现了全站缓存。

  • 相关阅读:
    Linux下Apache服务器并发优化
    centos 7 mount win共享文件夹 开机自动挂载
    自学 phpredis 的心路历程
    VM虚拟机下centos7 无法上网的问题解决办法
    php headers_sent 函数的作用
    is_file 与 file_exists 的区别
    php 面向对象 中的self
    php 去除所有空格 包括中文空格圆角空格
    滑动窗口滚动条触发事件
    PHP中file_exists与is_file、is_dir的区别,以及执行效率的比较 转自#冰雪傲骨#
  • 原文地址:https://www.cnblogs.com/zhangguosheng1121/p/11152167.html
Copyright © 2020-2023  润新知