07.Django-缓存
缓存
缓存是将一些常用的数据保存到内存或者memcache中。在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。
一、如何提高网站并发量?
- cdn加速:把静态资源放到别人服务器
- 精灵图
- 后台数据库用mysql+redis
- sql的优化:索引,分库分表,读写分离
- 用缓存
- 程序架构:集群化的部署,分布式+异步 celery:分布式异步任务
二、缓存方式
1. 开发调式缓存
开发调试缓存为开发调试使用,实际上不执行任何操作
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 缓存后台使用的引擎
'TIMEOUT': 300, # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
'CULL_FREQUENCY': 3,
}
}
}
2. 内存缓存
将缓存内容保存至内存区域中
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定缓存使用的引擎
'LOCATION': 'unique-snowflake', # 写在内存中的变量的唯一值
'TIMEOUT':300, # 缓存超时时间(默认为300秒,None表示永不过期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
'CULL_FREQUENCY': 3,
}
}
}
3. 文件缓存
Django会以自己的形式把缓存文件保存在配置文件中指定的目录中
CACHES = {
'default': {
'BACKEND':'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
'LOCATION': '/var/tmp/django_cache', #指定缓存的路径
'TIMEOUT':300, #缓存超时时间(默认为300秒,None表示永不过期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
'CULL_FREQUENCY': 3,
}
}
}
4. 数据库缓存
把缓存数据存储在数据库中
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 指定缓存使用的引擎
'LOCATION': 'cache_table', # 数据库表
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
'CULL_FREQUENCY': 3,
}
}
}
5. Memcache缓存
5.1 使用python-memcached模块
缓存到Memcache数据库
# 此缓存使用python-memcached模块连接memcache
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211', #通过网络socket连接,缓存到单台服务的 memcache数据库
}
}
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'unix:/tmp/memcached.sock', #通过本地文件socket,缓存本机memcache数据库
}
}
#通过网络socket连接,缓存到memcache 集群
CACHES = { #其中 6和89为
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
('172.19.26.240:11211',6),
('172.19.26.242:11211',89),
]
}
}
5.2 使用pylibmc模块
还可以使用其他Python模块连接到Memcache,老铁你是否联想到了 redis?默认还不支持!需要借助第三方插件;
# 此缓存使用pylibmc模块连接memcache
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': '127.0.0.1:11211',
}
}
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': '/tmp/memcached.sock',
}
}
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': [
'172.19.26.240:11211',
'172.19.26.242:11211',
]
}
}
三、缓存应用
1. 单独视图缓存
因为缓存的原因,不停的刷新浏览器时会发现,页面上显示的时间每15秒钟变化一次;
立即在数据库中添加一个用户对象,刷新浏览器,网页上不会立即显示刚才添加的用户;
一直刷新浏览器15秒后,新添加的用户才会在前端页面上显示出来。
添加路由记录
url(r"^index$",views.index)
定义视图函数
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>
2. 局部视图缓存
刷新页面时,整个网页有一部分页面实现缓存即为局部视图缓存
添加路由记录
url(r"^index$",views.index)
定义视图函数
from django.shortcuts import render
import time
def index(request):
ctime = time.time()
return render(request,"index.html",{"ctime":ctime})
定义HTML页面
{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head>
<meat charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ ctime }}</h1>
{% cache 15 'aaa' %}
<h1>{{ ctime }}</h1>
{% endcache %}
</body>
</html>
刷新浏览器可以看到,第一个时间实时变化,后面一个时间15秒钟变化一次
3. 全站使用缓存
用户的请求到达中间件,并经过中间件的认证
如果请求的内容在缓存中,则使用FetchFromCacheMiddleware获取内容并返回给用户
请求的内容不存在缓存,去操作数据库取得数据,经过渲染生成字符串返回给用户
当返回给用户之前,判断缓存中是否已经存在该数据,如果不存在,则UpdateCacheMiddleware会基于取得的数据生成Django的缓存
添加路由记录
url(r"^index$",views.index)
配置文件
from django.middleware.cache import UpdateCacheMiddleware
from django.middleware.cache import FetchFromCacheMiddleware
MIDDLEWARE_CLASSES = [
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
]
CACHE_MIDDLEWARE_SECONDS=15
定义视图函数
from django.shortcuts import render
import time
def index(request):
ctime = time.time()
return render(request,"index.html",{"ctime":ctime})
定义HTML网页
<body>
<h1>{{ ctime }}</h1>
<ul>
{% for user in user_list %}
<li>{{ user.name }}</li>
</ul>
</body>
刷新浏览器时15秒,页面上的时间变化一次,这样就实现了全站缓存
07.Django-缓存的更多相关文章
- 07: Django 使用ldap登录、注销等
目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...
- Django缓存使用方法
Django缓存分为Session和Cookie:Session为放在服务器端的缓存:Cookie为放在客户端(浏览器)的缓存. Session一般用来保存登录会话:Cookie一般用来保存一些个性化 ...
- Django 缓存系统
Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多. 缓存系统工 ...
- drf版本控制 和django缓存,跨域问题,
drf版本控制 基于url的get传参方式 REST_FRAMEWORK={ # "DEFAULT_AUTHENTICATION_CLASSES":["app01.aut ...
- 版本控制,django缓存,跨域问题解决
复习 分页: 1. 简单分页 2. 偏移分页 3. 加密分页 解析器:客户处理前端提交来的数据 urlencode: body体中的数据格式: key=value& formdata编码:为区 ...
- 中间件和Django缓存
中间件定义: 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的请求进行控制 中间件是一类. 看下面的代码在settings里 ...
- 一.rest-framework之版本控制 二、Django缓存 三、跨域问题 四、drf分页器 五、响应器 六、url控制器
一.rest-framework之版本控制 1.作用 用于版本的控制 2.内置的版本控制 from rest_framework.versioning import QueryParameterVer ...
- Django缓存设置
由于Django构建得是动态网站,每次客户端请求都要严重依赖数据库,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...
- [django]django缓存
发现搞了全局缓存后,刷新得不到最新数据了. 还好有过期时间 redis常用: https://www.cnblogs.com/fansik/p/5483060.html django-redis缓存: ...
- Django - 缓存应用
Django缓存应用: https://www.cnblogs.com/zuoshoushizi/p/7850281.html https://www.cnblogs.com/alice-bj/p/9 ...
随机推荐
- ql的python学习之路-day3
字典操作 特性: 1.无序的 2.key是唯一的 , ,,], ,,], ,,], }, ,,], 'bbb' : ['a', 'b', 'c'], }}
- mysql 5.7.22安装
1.解压目录. 2.安装 3.重新设置密码 set password=password('123456'); FLUSH PRIVILEGES;
- React:List and key
在React中,可以通过数组方法返回一组 组件元素,并将该数组作为render()的js插值. function NumberList(props) { const numbers = props.n ...
- js 前端向服务器端传送文件的常用请求方式
在做项目的过程当中写到文件上传的功能,想着之前也是踩坑过来的,就在这里总结下自己常用的方法吧.我们现在一般都是通过ajax来搭起前后端数据交互的桥梁,但是大家在做到有文件需要上传的时候就会发现我们用a ...
- 用C++验证三门问题
三门问题(换门): #include <iostream> #include <cstdlib> #include <ctime> #define random(a ...
- Django ORM性能优化之count和len方法的选择(非常详细推荐干货)
接下来我将从源码层面分情况和应用分析我们在计算queryset数据集时是用orm的count函数计算长度还是用len函数计算数据集长度. 首先,我们知道ORM查询queryset数据集是惰性查询的,只 ...
- ie ajax 跨域情况遇到的各种问题
jQuery.support.cors = true; http://blog.csdn.net/jupiter37/article/details/25694289 jQuery ajax跨域调用出 ...
- SICP 题解集合
1.1(略) 1.2 biwascheme> (/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5))))) (* 3 (- 6 2) (- 2 7))) => -0.24666 ...
- js时间格式转换,传入时间戳,第二哥参数是格式,也可不传
export function parseTime(time, pattern) { if (arguments.length === 0 || !time) { return null } cons ...
- openxl模块从excel里面读取数据
#excel读取数据 from openpyxl import load_workbook class Do_Excel: def __init__(self,file,work_space,inde ...