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函数式编程
Jun 09 Python
举例详解Python中threading模块的几个常用方法
Jun 18 Python
Python中sort和sorted函数代码解析
Jan 25 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
PyQt5响应回车事件的方法
Jun 25 Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 Python
tensorflow 获取所有variable或tensor的name示例
Jan 04 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
pandas取dataframe特定行列的实现方法
May 24 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 Python
python中pycryto实现数据加密
Apr 29 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语法(3)
2006/10/09 PHP
php中mysql模块部分功能的简单封装
2011/09/30 PHP
php通过字符串调用函数示例
2014/03/02 PHP
浅析php适配器模式(Adapter)
2014/11/25 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
javascript cookies操作集合
2010/04/12 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
页面点击小红心js实现代码
2018/05/26 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
Python最长公共子串算法实例
2015/03/07 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
Django卸载之后重新安装的方法
2017/03/15 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
PyQt5每天必学之关闭窗口
2018/04/19 Python
Python操作Oracle数据库的简单方法和封装类实例
2018/05/07 Python
一篇文章搞懂Python的类与对象名称空间
2018/12/10 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
Ajax请求总共有多少种Callback
2016/07/17 面试题
学校门卫工作职责
2013/12/07 职场文书
高中考试作弊检讨书
2014/01/14 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
2016春节慰问信范文
2015/03/25 职场文书
《司马光》教学反思
2016/02/22 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python