Django几种缓存机制的配置和应用

settings.py文件配置:

内存缓存(将缓存内容保存至内存区域中)

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 指定缓存使用的引擎
  'LOCATION': 'unique-snowflake',         # 写在内存中的变量的唯一值 
  'TIMEOUT':300,             # 缓存超时时间(默认为300秒,None表示永不过期)
  'OPTIONS':{
   'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
   'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  }  
 }
}

文件缓存(把缓存数据存储在文件中)

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

数据库缓存(把缓存数据存储在数据库中)

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 指定缓存使用的引擎
  'LOCATION': 'cache_table',          # 数据库表    
  'OPTIONS':{
   'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
   'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  }  
 }   
}

注意,创建缓存的数据库表使用的语句:

python manage.py createcachetable

用redis做Django缓存

不使用Django中session默认的存储方式,直接将session存储的地方配置到redis中

# 1.在虚拟环境中安装包
pip install django-redis-sessions==0.5.6
 
# 2.在Django项目的settings文件中增加下面的配置
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 2
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'

先将Django中的缓存设置为redis,然后将session的存储地方设置为Django的缓存中

#1.先在虚拟环境中安装包
pip install django_redis
 
#2. 设置redis作为django的缓存设置
CACHES = {
 "default": {
  "BACKEND": "django_redis.cache.RedisCache",
  # 把这里缓存你的redis服务器ip和port
  "LOCATION": "redis://172.16.179.142:6379/12",
  "OPTIONS": {
   "CLIENT_CLASS": "django_redis.client.DefaultClient",
  }
 }
}
 
# 3.设置redis存储django的session信息
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

Django中的缓存应用

单独视图缓存

# views.py
from app01 import models
from django.views.decorators.cache import cache_page
import time
 
@cache_page(15)         #超时时间为15秒
def index(request):
 user_list=models.UserInfo.objects.all()  #从数据库中取出所有的用户对象
 ctime=time.time()       #获取当前时间
 return render(request,"index.html",{"user_list":user_list,"ctime":ctime})
// html
body>
<h1>{{ ctime }}</h1>
<ul>
{% for user in user_list %}
 <li>{{ user.name }}</li>
{% endfor %}
</ul>
</body>

全站使用缓存

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

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

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

修改settings.py配置文件

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的响应
]
 
CACHE__MIDDLEWARE_SECONDS=15         # 设定超时时间为15秒

局部视图缓存

from django.shortcuts import render
import time
 
def index(request):
 # user_list = models.UserInfo.objects.all()
 ctime = time.time()
 return render(request,'index.html',{'ctime':ctime})
{% load cache %}    # 加载缓存
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ ctime }}</h1>
{% cache 15 'aaa' %}   # 设定超时时间为15秒
<h1>{{ ctime }}</h1>
{% endcache %}
</body>
</html>

通过闭包自定义缓存函数

# page_cache作用为传递过期时间
def page_cache(timeout):
    '''页面缓存'''
    def wrap1(view_func):
        def wrap2(request, *args, **kwargs):
            key = 'PAGES-%s' % request.get_full_path()
            # 从缓存获取 response
            response = cache.get(key)
            if response is not None:
                print('return from cache')
                # 如果有 -> 直接返回 response
                return response
            else:
                print('return from view')
                # 没有 -> 执行 view 函数
                response = view_func(request, *args, **kwargs)
                # 将结果添加缓存
                cache.set(key, response, timeout)
                return response
        return wrap2
    return wrap1
posted @ 2018-05-14 10:58  TasteL  阅读(151)  评论(0编辑  收藏  举报