由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

Django中提供了6种缓存方式:
  1、开发调试,没有实质用途,只是配置了缓存配置
  2、内存,将缓存保存在本地内存
  3、文件,将缓存保存在本地文件
  4、数据库,将缓存保存在数据库
  5、Memcache缓存(python-memcached模块)将缓存保存在Memcache,用的python-memcached模块
  6、Memcache缓存(pylibmc模块)将缓存保存在Memcache,用的pylibmc模块

配置

1、开发调试配置,

#缓存配置
# 自定义缓存key
def default_key_func(key, key_prefix, version):
return '%s:%s:%s' % (key_prefix, version, key) # 配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 开发调试,引擎
'TIMEOUT': 300, # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)如果使用中没设置,这里启用
'OPTIONS': {
'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3,删除百分之3)
},
'KEY_PREFIX': '', # 缓存key的前缀(默认空)
'VERSION': 1, # 缓存key的版本(默认1),设置后缓存key会是,KEY_PREFIX前缀加VERSION版本
# 'KEY_FUNCTION': default_key_func # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
}
}

2、内存配置

#缓存配置
# 自定义缓存key
def default_key_func(key, key_prefix, version):
return '%s:%s:%s' % (key_prefix, version, key) # 配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', #配置内存引擎
'LOCATION': 'unique-snowflake', #配置内存缓存名称 'TIMEOUT': 300, # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)如果使用中没设置,这里启用
'OPTIONS': {
'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3,删除百分之3)
},
'KEY_PREFIX': '', # 缓存key的前缀(默认空)
'VERSION': 1, # 缓存key的版本(默认1),设置后缓存key会是,KEY_PREFIX前缀加VERSION版本
# 'KEY_FUNCTION': default_key_func # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
}
}

3、文件配置

#缓存配置
# 自定义缓存key
def default_key_func(key, key_prefix, version):
return '%s:%s:%s' % (key_prefix, version, key) # 配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #配置文件引擎
'LOCATION': os.path.join(BASE_DIR,'huancuen'), #配置文件缓存路径,当前工程下的huancuen文件夹 'TIMEOUT': 300, # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)如果使用中没设置,这里启用
'OPTIONS': {
'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3,删除百分之3)
},
'KEY_PREFIX': '', # 缓存key的前缀(默认空)
'VERSION': 1, # 缓存key的版本(默认1),设置后缓存key会是,KEY_PREFIX前缀加VERSION版本
# 'KEY_FUNCTION': default_key_func # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
}
}

4、数据库配置,这种方式不推荐,缓存本来就是解决数据库访问量,结果还是要访问数据库

# 配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache', #配置数据库引擎
'LOCATION': 'my_cache_table', #配置数据库表,注意:执行创建表命令 python manage.py createcachetable 'TIMEOUT': 300, # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)如果使用中没设置,这里启用
'OPTIONS': {
'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3,删除百分之3)
},
'KEY_PREFIX': '', # 缓存key的前缀(默认空)
'VERSION': 1, # 缓存key的版本(默认1),设置后缓存key会是,KEY_PREFIX前缀加VERSION版本
# 'KEY_FUNCTION': default_key_func # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
}
}

5、Memcache缓存(python-memcached模块)配置

# 此缓存使用python-memcached模块连接memcache,3种连接方式

    CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', #连接引擎
'LOCATION': '127.0.0.1:11211',                      #服务器IP和端口
}
} CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',  #连接引擎
'LOCATION': 'unix:/tmp/memcached.sock',                 
}
} CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', #连接引擎
'LOCATION': [                               #多服务器IP和端口
'172.19.26.240:11211',
'172.19.26.242:11211',
]
}
}
#其他参数同上

6、Memcache缓存(pylibmc模块)配置

# 此缓存使用pylibmc模块连接memcache,3种连接方式

    CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',  #连接引擎
'LOCATION': '127.0.0.1:11211',                     #ip端口
}
} CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': '/tmp/memcached.sock',
}
} CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',  #连接引擎
'LOCATION': [                               #多服务器ip端口
'172.19.26.240:11211',
'172.19.26.242:11211',
]
}
}
#其他参数同上

缓存应用

注意:以上任意那种方式的缓存,在应用上都是一样的,应用首先要在全局配置缓存参数

1、全站应用缓存,不常用

使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存

Django提供了两个写好的中间件,用于全站缓存

MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware', #当请求来的时候判断缓存是否存在,如果不存在写入缓存
# 其他中间件...
'django.middleware.cache.FetchFromCacheMiddleware', #如果缓存存在,在缓存里拿数据
]

全站缓存中间件注册

#中间件
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
# 'app1.chajian.zhong_jian_jian.zhongjianjian',
'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',
]

只要在中间件列表里注册了这两个缓存中间件,就自动缓存全站了

2、单独视图缓存

就是在逻辑处理函数上用上缓存装饰器,这样被用上缓存装饰器的逻辑处理的页面将自动缓存,要去掉全局的缓存中间件

导入缓存装饰器模块 from django.views.decorators.cache import cache_page

@cache_page(60)缓存装饰器,用在要缓存的逻辑处理函数上,参数是缓存时间秒

from django.shortcuts import render,redirect
import time from django.views.decorators.cache import cache_page #导入缓存装饰器 #逻辑处理模块
@cache_page(5) #运用缓存装饰器,缓存保存时间5秒
def special(request):
t = time.time()
return render(request, 'app1/index.html',locals())

3、局部模板使用缓存

就是在html模板里应用,指定一个页面的某一个区块缓存

{% load cache %}#在模板页面导入局部缓存模块

{% cache 缓存时间 自定义缓存名称 %}
  需要缓存的区块
{% endcache %}

{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" type="text/css" href="/static/css/tou.css">
</head>
<body> {% cache 5 suij %}
{{ t }}
{% endcache %} </body>
</html>

将缓存保存在Redis

首先安装Redis缓存软件

然后安装Django中使用Redis缓存的第三方模块 django-redis

配置

#缓存配置
# 自定义缓存key
def default_key_func(key, key_prefix, version):
return '%s:%s:%s' % (key_prefix, version, key) # 配置:
CACHES = {
'default': {
'BACKEND': "django_redis.cache.RedisCache", #配置文件引擎
'LOCATION': "redis://127.0.0.1:6379", #配置文件缓存路径 'TIMEOUT': 300, # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)如果使用中没设置,这里启用
'OPTIONS': {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3,删除百分之3)
},
'KEY_PREFIX': 'jxiou', # 缓存key的前缀(默认空)
'VERSION': 1, # 缓存key的版本(默认1),设置后缓存key会是,KEY_PREFIX前缀加VERSION版本
# 'KEY_FUNCTION': default_key_func # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
}
}

配置默认连接池

配置默认连接池很简单, 你只需要在 CACHES 中使用 CONNECTION_POOL_KWARGS 设置连接池的最大连接数量即可:

CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
...
"OPTIONS": {
"CONNECTION_POOL_KWARGS": {"max_connections": 100}
}
}
}

更多教程   http://django-redis-chs.readthedocs.io/zh_CN/latest/#id12

使用同上

十五 Django框架,缓存的更多相关文章

  1. Python学习(三十)—— Django框架简介

    转载自:http://www.cnblogs.com/liwenzhou/p/8296964.html Django框架简介 一.MVC框架和MTV框架(了解即可) MVC,全名是Model View ...

  2. 五 Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  3. python 学习笔记十五 django基础

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  4. python 学习笔记十五 web框架

    python Web程序 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. Python的WEB框架分为两类: 自己写socket,自 ...

  5. 十六 Django框架,信号

    Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 也就是当程序有指定动作时,触发一个信号函数 1.Django内置信 ...

  6. 十二 Django框架,自定义分页

    自定义分页模块 #!/usr/bin/env python #coding:utf-8 from django.utils.safestring import mark_safe #封装分页类模块 c ...

  7. redis数据库如何用Django框架缓存数据

    ---恢复内容开始--- 一.python 使用redis 1.1 安装 pip install redis 测试有一些基本的数据类型 import redis # redis 是一个缓存数据库 # ...

  8. 十九 Django框架,发送邮件

    全局配置settings.py EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' #发送邮件引擎 EMAIL_USE_TLS ...

  9. 十八 Django框架,生成二维码

    用Python来生成二维码,需要qrcode模块,qrcode模块依赖Image 模块,所以首先安装这两个模块 生成二维码保存图片在本地 import qrcode img = qrcode.make ...

随机推荐

  1. mysql数据索引

    索引是建立在数据库表中的某些列的上面.因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引.一般来说,应该在这些列上创建索引,例如:在经常需要搜索的列上,可以加快搜索的速 ...

  2. 谨慎使用ArrayList中的subList方法

    转自:https://www.toutiao.com/a6705958780460335619/?tt_from=weixin&utm_campaign=client_share&wx ...

  3. keil中使用Astyle格式化你的代码的方法2篇合

    关于Astyle Astyle 的全称是Artistic Style的简称,是一个开源的源代码格式化工具,可以对C,C++,C#以及Java等编程语言的源代码进行缩进.格式化.美化.Home Page ...

  4. EventBus的使用详解,功能为在Fragment,Activity,Service,线程之间传递消息

    最近跟同事用到了EventBus的使用,之前不太了解EventBus,查阅资料发现EventBus还挺好用的,用法比较简单,下面就把我看到的关于EventBus的博客分享给大家,里面介绍了很多的使用详 ...

  5. 我自己曾经经历的CMMI3认证通过关于软件测试的访谈【转载】

    转自<http://blog.csdn.net/jcy58/article/details/51908884> 因为当初我在公司里是负责软件测试工作的,所以CMMI3和测试相关的访谈,就是 ...

  6. 【BZOJ4010】[HNOI2015]菜肴制作 拓扑排序

    [BZOJ4010][HNOI2015]菜肴制作 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高 ...

  7. spring data jpa 利用@Query进行查询

    参照https://blog.csdn.net/yingxiake/article/details/51016234#reply https://blog.csdn.net/choushi300/ar ...

  8. 使用基本 SQL 命令

    概述 在本教程中,将学习结构化查询语言 (SQL),包括: 使用基本 SQL 命令 执行基本数据操做 数据库和 SQL 在本系列教程中,目前我们使用平面文本文件来存储数据.平面文本文件可能适合相对较少 ...

  9. linux 中sort命令 按照指定列排序

    sort怎样按指定的列排序0000 27189 41925425065f 15 419254250663 7 419254250675 5 419254250691 76 419254250693 2 ...

  10. 读a paper of ICCV 2017 : Areas of Attention for Image Captioning

    前言废话,作者说把代码公布在gitub上,但是迟迟没有公布,我发邮件询问代码情况,邮件也迟迟不回,表示很尴尬..虽然种种这些,但是工作还是好工作,这个没的黑,那我们今天就来详细的介绍这篇文章. 导论: ...