Django缓存机制

一、缓存介绍

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

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

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

 

二、缓存位置的配置

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

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',  # 指定缓存使用的引擎
        'LOCATION': 'E:\django_huancun\cache',  # 指定缓存的路径
        '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秒,页面上的时间变化一次,这样就实现了全站缓存。

 

posted @ 2019-07-08 17:09  TianShu  Views(116)  Comments(0Edit  收藏  举报