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统计文件行数示例分享
Feb 21 Python
解读Python中degrees()方法的使用
May 18 Python
初步认识Python中的列表与位运算符
Oct 12 Python
python直接访问私有属性的简单方法
Jul 25 Python
Python基于scapy实现修改IP发送请求的方法示例
Jul 08 Python
Mac下Anaconda的安装和使用教程
Nov 29 Python
python 经典数字滤波实例
Dec 16 Python
Python如何使用字符打印照片
Jan 03 Python
完美解决python针对hdfs上传和下载的问题
Jun 05 Python
python实现一次性封装多条sql语句(begin end)
Jun 06 Python
python3 中时间戳、时间、日期的转换和加减操作
Jul 14 Python
python源文件的字符编码知识点详解
Mar 04 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读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
2017/04/04 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
json的前台操作和后台操作实现代码
2012/01/20 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
jQuery利用sort对DOM元素进行排序操作
2016/11/07 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
vue+iview分页组件的封装
2020/11/17 Vue.js
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
用Python自动清理系统垃圾的实现
2021/01/18 Python
详解Canvas事件绑定
2018/06/27 HTML / CSS
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
售后服务经理岗位职责范本
2014/02/22 职场文书
《分一分》教学反思
2014/04/13 职场文书
霸气押韵的班级口号
2014/06/09 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
物业接待员岗位职责
2015/04/15 职场文书
Python编解码问题及文本文件处理方法详解
2021/06/20 Python
【DOTA2】当街暴打?PSG LGD vs VG - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA
配置nginx负载均衡
2022/05/06 Servers