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

一、Django缓存的配置和应用

Django中提供了6种缓存方式:

  • 开发调试  (开发调试使用)
  • 内存(不做配置默认:默认配置是Django内置配置文件(用户不可见)设置在内存里面)
  • 文件
  • 数据库
  • Memcache缓存(python-memcached模块)
  • Memcache缓存(pylibmc模块)

Django的缓存到底存储在哪里是根据Django的 setings.py配置文件来决定的!

1、配置  在Django项目setings.py中配置 

a、缓存至内存:

CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',#缓存到内存
'LOCATION': 'XXOO', #在内存中存储的变量(保证唯一)
'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
'CULL_FREQUENCY': 3,
# 缓存到达最大个数之后,Django会自动清空3/1 ,设置为10 就剔除10/1
}
}
}

b、缓存至目录文件

会不会有这样的疑惑?如果把数据缓存至本地目录,和去数据库里获取数据有什么区别?

1、缓存的内容和数据库里不一样,是经过模板渲染处理好的整体数据;而去数据库获取数据还需要模板渲染进行加工处理;

2、距离不一样,缓存到本地目录,而Django连接数据库需要socket;

CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var', #设置缓存文件的目录
}
}

c、缓存至数据库

缓存到数据库也好,至少相对而言少了模板渲染的过程;

  CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table', # 数据库表
}
}

d1、缓存到Memcache数据库(python-memcached模块)

# 此缓存使用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),
]
}
}

d2、Memcache缓存(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',
]
}
}

2、应用 

a、全站缓存(大粒度应用)

全站应用缓存就是对 客户端所有request应用,提到所有请求 我就联想到了Django的中间件。

来看一张图

你认为request请求进来,这个缓存中间件应该设置在中间件2 因为 要先请求进来,要先经过CSRF中间件,因为不合法的request,缓存也不应该给让他看到;

再看一张图

response请求响应之后,这个缓存中间件应该设置放在最后中间件4,避免之前的中间件修改过response的内容,造成缓存和数据库内容不一致;

Django缓存的中间件Django已经帮我们准备好了,我们只需要添加上就OK了;

MIDDLEWARE = [
'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.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware',
] CACHE_MIDDLEWARE_SECONDS = 10 #设置超时时间 10秒

b、视图函数应用(适中粒度应用)

from django.views.decorators.cache import cache_page  #导入设置缓存的装饰器
@cache_page(60 * 5) #注意 60*3 是缓存时间为3分钟,(3)3秒,如果更换了设置,千万记得更新url,否则会使用原来设置的过期时间,和原来的缓存;
def index(request):
userlist=models.UserInfo.objects.all()
ctime=time.time()
return render(request,'index.html',locals())
@cache_page(5)
def test(request):
# userlist=models.UserInfo.objects.all()
ctime=time.time()
return render(request,'index.html',locals())
#注意 60*3 是缓存时间为3分钟,(3)3秒,如果更换了设置,千万记得更新url,否则会使用原来设置的过期时间,和原来的缓存;

c、局部模板应用缓存(小粒度应用)

缓存应该加在我们网站页面不实时更新的地方;

{% load cache %}     {#1、首先加载缓存#}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body> {% cache 5000 缓存key %} {# 2 用cache tag 围绕 要缓存的内容#}
<p>缓存内容</p>
{% endcache %}

django 缓存 实现的更多相关文章

  1. Django缓存使用方法

    Django缓存分为Session和Cookie:Session为放在服务器端的缓存:Cookie为放在客户端(浏览器)的缓存. Session一般用来保存登录会话:Cookie一般用来保存一些个性化 ...

  2. Django 缓存系统

    Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多. 缓存系统工 ...

  3. drf版本控制 和django缓存,跨域问题,

    drf版本控制 基于url的get传参方式 REST_FRAMEWORK={ # "DEFAULT_AUTHENTICATION_CLASSES":["app01.aut ...

  4. 版本控制,django缓存,跨域问题解决

    复习 分页: 1. 简单分页 2. 偏移分页 3. 加密分页 解析器:客户处理前端提交来的数据 urlencode: body体中的数据格式: key=value& formdata编码:为区 ...

  5. 中间件和Django缓存

    中间件定义: 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的请求进行控制 中间件是一类. 看下面的代码在settings里 ...

  6. 一.rest-framework之版本控制 二、Django缓存 三、跨域问题 四、drf分页器 五、响应器 六、url控制器

    一.rest-framework之版本控制 1.作用 用于版本的控制 2.内置的版本控制 from rest_framework.versioning import QueryParameterVer ...

  7. Django缓存设置

    由于Django构建得是动态网站,每次客户端请求都要严重依赖数据库,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...

  8. [django]django缓存

    发现搞了全局缓存后,刷新得不到最新数据了. 还好有过期时间 redis常用: https://www.cnblogs.com/fansik/p/5483060.html django-redis缓存: ...

  9. Django - 缓存应用

    Django缓存应用: https://www.cnblogs.com/zuoshoushizi/p/7850281.html https://www.cnblogs.com/alice-bj/p/9 ...

  10. Django 2.0 学习(18):Django 缓存、信号和extra

    Django 缓存.信号和extra Django 缓存 由于Django是动态网站,所以每次请求均会去数据库进行相应的操作,当程序访问量大时,耗时必然会显著增加.最简单的解决方法是:使用缓存,缓存将 ...

随机推荐

  1. 记录下这周的mysql调优工作

    这周一至周四基本都在做mysql的测试和调优工作,包括erlang端对mysql的写入测试,到今天为止暂且告一段落,下周先做下其他的开发.    测试环境    使用的测试环境是aliyun的杭州节点 ...

  2. springBoot jpa 分页

    1.jap中有自带的分页方法 在dao层中使用 Page<LinkUrl> findAll(Pageable pageable); 2.在controller层 public List&l ...

  3. 《超实用的Node.js代码段》连载三:Node.js深受欢迎的六大原因

    <超实用的Node.js代码段>连载一:获取Buffer对象字节长度 <超实用的Node.js代码段>连载二:正确拼接Buffer Node.js是一种后起的优秀服务器编程语言 ...

  4. Object-C反射读取实体属性和值

    举例: 首先定义TestModel如下: @interface TestModel : NSObject @property (nonatomic, strong) NSString *name; @ ...

  5. 使用poi或jxl,通过java读写xls、xlsx文档

    package nicetime.com.baseutil; import jxl.Sheet;import jxl.Workbook;import jxl.read.biff.BiffExcepti ...

  6. CodeForces 66C Petya and File System (实现)

    模拟题,map搞一搞.要想清楚一个结点应该是要通过一个字符串找到下一个结点,题目保证所以文件夹非空,所以只要判断一个结点是不是叶子结点就可以判断它是不是文件,用了点c11的特性. #include&l ...

  7. [大坑]Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR

    报错tensorflow/stream_executor/cuda/cuda_dnn.cc:338] Could not create cudnn handle: CUDNN_STATUS_INTER ...

  8. javaweb基础(16)_jsp指令

    一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: pa ...

  9. shell脚本,awk里面的BEGIN讲解。

    解释: BEGIN{}这个特殊的pattern最常用的就是 变量赋值. BEGIN这个pattern就是文件没开始读的时候 执行 awk 'BEGIN{FS=":";OFS=&qu ...

  10. Neural Style论文笔记+源码解析

    引言 前面在Ubuntu16.04+GTX1080配置TensorFlow并实现图像风格转换中介绍了TensorFlow的配置过程,以及运用TensorFlow实现图像风格转换,主要是使用了文章A N ...