Django如何实现内容缓存示例详解


Posted in Python onSeptember 24, 2017

前言

本文主要给大家介绍了关于Django实现内容缓存的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

1.缓存的简介

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

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

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

2.Django提供了6种缓存方式

  • 开发调试缓存
  • 内存缓存
  • 文件缓存
  • 数据库缓存
  • Memcache缓存(使用python-memcached模块)
  • Memcache缓存(使用pylibmc模块)

经常使用的有文件缓存和Mencache缓存

2.1 各种缓存方式的配置文件说明

2.1.1 开发调试(此模式为开发调试使用,实际上不执行任何操作)

settings.py文件配置

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)
  },
 }
}

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

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)
  }  
 }
}

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

settings.py文件配置

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)
  }
 }   
}

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

settings.py文件配置

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

Memcached是Django原生支持的缓存系统.要使用Memcached,需要下载Memcached的支持库python-memcached或pylibmc.

2.1.5 Memcache缓存(使用python-memcached模块连接memcache)

settings.py文件配置

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎
  'LOCATION': '192.168.10.100:11211',         # 指定Memcache缓存服务器的IP地址和端口
  'OPTIONS':{
   'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
   'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  }
 }
}

LOCATION也可以配置成如下:

'LOCATION': 'unix:/tmp/memcached.sock',   # 指定局域网内的主机名加socket套接字为Memcache缓存服务器
'LOCATION': [         # 指定一台或多台其他主机ip地址加端口为Memcache缓存服务器
 '192.168.10.100:11211',
 '192.168.10.101:11211',
 '192.168.10.102:11211',
]

2.1.6 Memcache缓存(使用pylibmc模块连接memcache)

settings.py文件配置
 CACHES = {
  'default': {
   'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',  # 指定缓存使用的引擎
   'LOCATION':'192.168.10.100:11211',         # 指定本机的11211端口为Memcache缓存服务器
   'OPTIONS':{
    'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
    'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
   },  
  }
 }

LOCATION也可以配置成如下:

'LOCATION': '/tmp/memcached.sock',  # 指定某个路径为缓存目录
'LOCATION': [       # 分布式缓存,在多台服务器上运行Memcached进程,程序会把多台服务器当作一个单独的缓存,而不会在每台服务器上复制缓存值
 '192.168.10.100:11211',
 '192.168.10.101:11211',
 '192.168.10.102:11211',
]

Memcached是基于内存的缓存,数据存储在内存中.所以如果服务器死机的话,数据就会丢失,所以Memcached一般与其他缓存配合使用

3.Django中的缓存应用

Django提供了不同粒度的缓存,可以缓存某个页面,可以只缓存一个页面的某个部分,甚至可以缓存整个网站.

3.1 单独视图缓存

例子,为单个视图函数添加缓存

路由配置:

url(r'^index$',views.index),

数据库

Django如何实现内容缓存示例详解

views代码:

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})

index.html代码:

body>
<h1>{{ ctime }}</h1>
<ul>
 {% for user in user_list %}
  <li>{{ user.name }}</li>
 {% endfor %}
</ul>
</body>

因为缓存的原因,不停的刷新浏览器时会发现,页面上显示的时间每15秒钟变化一次.

在立即刷新浏览器的时候,立即在数据库中添加一个用户对象,此时继续刷新浏览器,前端页面上不会显示刚才添加的用户

一直刷新浏览器15秒后,新添加的用户才用在前端页面上显示出来.

上面的例子是基于内存的缓存配置,基于文件的缓存该怎么配置呢??

更改settings.py的配置

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

然后再次刷新浏览器,可以看到在刚才配置的目录下生成的缓存文件

Django如何实现内容缓存示例详解

通过实验可以知道,Django会以自己的形式把缓存文件保存在配置文件中指定的目录中.

3.2 全站使用缓存

既然是全站缓存,当然要使用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秒

views视图函数

from django.shortcuts import render
import time

def index(request):
 ctime = time.time()
 return render(request,'index.html',{'ctime':ctime})

其余代码不变,刷新浏览器是15秒,页面上的时间变化一次,这样就实现了全站缓存.

3.3 局部视图缓存

例子,刷新页面时,整个网页有一部分实现缓存

views视图函数

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>

刷新浏览器可以看到,第一个时间实时变化,后面一个时间每15秒钟变化一次

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python getopt详解及简单实例
Dec 30 Python
python实现图像识别功能
Jan 29 Python
Python使用numpy模块创建数组操作示例
Jun 20 Python
Python Grid使用和布局详解
Jun 30 Python
Windows下python3.6.4安装教程
Jul 31 Python
python批量将excel内容进行翻译写入功能
Oct 10 Python
如何关掉pycharm中的python console(图解)
Oct 31 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 Python
Python实现动态循环输出文字功能
May 07 Python
Pycharm修改python路径过程图解
May 22 Python
python中子类与父类的关系基础知识点
Feb 02 Python
pycharm配置python 设置pip安装源为豆瓣源
Feb 05 Python
Django查询数据库的性能优化示例代码
Sep 24 #Python
python学习教程之使用py2exe打包
Sep 24 #Python
python数据结构之列表和元组的详解
Sep 23 #Python
Python字符串和字典相关操作的实例详解
Sep 23 #Python
使用Turtle画正螺旋线的方法
Sep 22 #Python
详谈python read readline readlines的区别
Sep 22 #Python
Python实现针对含中文字符串的截取功能示例
Sep 22 #Python
You might like
php 全局变量范围分析
2009/08/07 PHP
php array的学习笔记
2012/05/16 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
Jquery操作radio的简单实例
2014/01/06 Javascript
jquery Ajax 实现加载数据前动画效果的示例代码
2014/02/07 Javascript
setInterval计时器不准的问题解决方法
2014/05/08 Javascript
JavaScript Sort 的一个错误用法示例
2015/03/20 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
2016/05/03 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
vue.js学习笔记:如何加载本地json文件
2017/01/17 Javascript
JavaScript调试之console.log调试的一个小技巧分享
2017/08/07 Javascript
js断点调试经验分享
2017/12/08 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
2019/05/14 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
原生js实现日期选择插件
2020/05/21 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
python enumerate函数的使用方法总结
2017/11/15 Python
python一键去抖音视频水印工具
2018/09/14 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
在Python中构建增广矩阵的实现方法
2019/07/01 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
flask实现验证码并验证功能
2019/12/05 Python
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
大学生实习自我鉴定
2013/12/11 职场文书
优秀教师工作感言
2014/02/16 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
个人四风对照检查材料
2014/09/26 职场文书
教师求职信怎么写
2015/03/20 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
python如何获取网络数据
2021/04/11 Python
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js