Django学习之十二:Cache 缓存组件
Django Cache 缓存组件
在FBV 或 CBV 需要缓存数据,又或者要进行全站缓存(利用中间件),单视图缓存(利用装饰器@cache_page(60 * 5) ),或者在template中使用{% cache 5 content_detail %} xxx {% endcache %} 进行页面局部缓存。这些场景都是需要用到缓存,来提高我们响应用户请求速度的。在django框架中,给我们提供了Cache组件,并暴露出满足以上4中需求的接口,我们只需要配置好我们的缓存引擎源及相关配置,就可以方便使用了。
博文图片挂了临时解决办法
缓存逻辑伪代码
given a URL, try finding that page in the cache
if the page is in the cache:
return the cached page
else:
generate the page
save the generated page in the cache (for next time)
return the generated page
配置缓存源
在配置settings.py中CACHES = {} 字典中, 添加缓存源,key为缓存源的别名,django默认给我们提供了一个默认缓存,并且是LocMemCahce即memcahe作为缓存引擎。当然可以配置多个缓存源,但是'default'只有一个,这个是默认使用的。当然默认的也可以替换,比如现在流行用reids作为默认缓存。
可配置参数说明
查看官网: cache配置参数说明, hint 这里!
01. Django的默认缓存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake'
}
}
该缓存引擎,对每一个进程是一个缓存,所以该缓存时线程安全的。(This cache is per-process (see below) and thread-safe.)
'LOCATION'设置时用于标识独立的内存存储。如果系统只有一个,那么可以忽略该设置。
由于时每个进程一个缓存实例,所以如果多线程或多进程,那么缓存的使用上就不是很高效,所以该缓存引擎不是非常适合生产环境,适合dev环境。
02. 基于Redis的django-redis
- 安装django-redis
# 通过pip安装
>>> pip install django-redis
# 通过pipenv 安装
>>> pyenv install django-redis
- 安装django-redis就会依赖安装redis.py
- 将默认的CACHES设置为django-redis并配置redis-server相关信息
django-redis连接到redis-server使用的是redis连接池。
所以django-redis也提供了一个接口,供我们直接从连接池中拿到redis连接,然后使用redis (get_redis_connection('default'));注意这种方式不是django cache组件提供的接口操作redis方式,这种方式是low-level的;而django cache组件则是在low-level基础上封装的更高级的接口,供我们使用。 - 安装完成django-redis后,配置为默认cache源:
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'CONNECTION_POOL_KWARGS': {
'max_connections': 1000
},
# 'PASSWORD': 'xxx', # 如果有设置了redis-server密码在这里设置
}
}
}
03. 自定义cache
可以查看django_redis.cache.RedisCache 都是继承了from django.core.cache.backends.base import BaseCache ,所以在django中高级的缓存操作都是通过BaseCache中定义的接口。
所以自定义cache backend 可以通过继承django.core.cache.backends.base.BaseCache 接口,然后实现接口中的方法。就可以将自己的backend配置到django中使用了。
04. Django其它内置的缓存源,直接开箱使用out-of-the-box
使用cache的示例
Tips: 通过redis-cli 查看所有库的key统计信息,命令是info keyspace;
1. cache在视图中示例
# 引入装饰器装饰视图函数即可缓存视图
from django.views.decorators.cache import cache_page
- FBV视图缓存
import time
from django.views.decoratosr.cache import cache_page
@chace_page(60*5) # 必须设置缓存的更新间隔,单位秒
def content_detail(request):
return HTTPResponse('hello' + str(time.time()))
- CBV视图缓存
特别注意:CBV的视图缓存使用cache_page()是放入URLConf中,而不是对get或者post等CBV内的方法进行装饰。
2. 全站缓存
在配置文件的中间件列表的首尾分别添加如下中间件:
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
......
'django.middleware.common.CommonMiddleware',
......
'django.middleware.cache.FetchFromCacheMiddleware',]
3. 利用模板系统页面部分缓存
{% load cache %}
{% cache 500 sidebar %}
.. sidebar ..
{% endcache %}
4. low-level api操作缓存
通过cache对象的api直接操作缓存。
- 首先,拿到cache对象:
from django.core.cache import caches #这是所有设置的cache对象的字典
from django.core.cache import cache # 这是”default" 默认的cahce对象
my_cache = caches['mycache']
my_cache.set('k1', 'abc', 30) # 设置k1 值为 ’abc' 有效期 30s.
Note: 注意,每个process 获取的 cache instance 都是独立的,不是同一个,为保证线程安全。
总结
- 参考:https://docs.djangoproject.com/en/2.1/topics/cache/#the-per-view-cache
- 从cache的backend引擎,将cache抽象出来,定义出cache的接口,实现细节各自引擎处理。
- 看到一句话: 抽象比细节活的更长久.
Django学习之十二:Cache 缓存组件的更多相关文章
- Django学习之十: staticfile 静态文件
目录 Django学习之十: staticfile 静态文件 理解阐述 静态文件 Django对静态文件的处理 其它方面 总结 Django学习之十: staticfile 静态文件 理解阐述 ...
- 任务四十二:UI组件之日历组件(三)
任务四十二:UI组件之日历组件(三) 面向人群: 有一定基础的同学 难度: 困难 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容的质量以及 ...
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- Django学习笔记(二):使用Template让HTML、CSS参与网页建立
Django学习笔记(二):使用Template让HTML.CSS参与网页建立 通过本文章实现: 了解Django中Template的使用 让HTML.CSS等参与网页建立 利用静态文件应用网页样式 ...
- Tensorflow深度学习之十二:基础图像处理之二
Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474 首先放出原始图像: ...
- 微信小程序把玩(二十二)action-sheet组件
原文:微信小程序把玩(二十二)action-sheet组件 action-sheet组件是从底部弹出可选菜单项,估计也是借鉴IOS的设计添加的,action-sheet有两个子组件, action-s ...
- 微信小程序把玩(十二)text组件
原文:微信小程序把玩(十二)text组件 通常文本设置要不在wxml中设置,再要不就是通过weml绑定在js中设置文字. wxml <view > <text>我是文本组件&l ...
- Django框架(十四)-- forms组件、局部钩子、全局钩子
一.什么是forms组件 forms组件就是一个类,可以检测前端传来的数据,是否合法. 例如,前端传来的邮箱数据,判断邮件格式对不对,用户名中不能以什么开头,等等 二.forms组件的使用 1.使用语 ...
随机推荐
- 深入理解.net - 3.类型Type
说到类型,.NET技术是基于通用类型系统(CTS,Common Type System)的,而CTS又是构建于公共语言架构(CLI,Common Language Infrastructure)之上, ...
- IntelliJ IDEA maven 构建简单springmvc项目
环境: apache-tomcat-8.5.15 jdk1.8.0_172 IDEA 建立一个maven-webapp项目:Create New Project 后点击next 然后next 可以选择 ...
- 利用JavaScriptSerializer转json实用方法
项目中经常碰到需要输出的是json数据,使用JavaScriptSerializer转换,以前老的方法如下. JavaScriptSerializer jss = new JavaScriptSeri ...
- jquery 获取jquery对象的标签类型
//jquery 对象 $("#"+控件id)[0] //查看控件类型 $("#"+控件id)[0].type 实例1: < select id=&qu ...
- pdf在线加载·
https://yq.aliyun.com/articles/40197 在线例子是这个
- 在centos,docker中安装HeadlessChrome
在centos6中安装chrome与chrome-driver,中间走了很多弯路,遇到很多坑,现将详细步骤总结如下.参考博客链接:https://blog.csdn.net/u013849486/ar ...
- Win7 系统记事本乱码及cmd闪退解决办法
打开控制面板,点击时钟.语言和区域 中文(简体)改为英语(英国),然后重启电脑,重启电脑之后,继续此操作,在把英语(英国)改为中文(简体),再次重启电脑,就OK了.
- Linux 6.8 TFS(Taobao File System)使用文档-安装篇
介绍 TFS(Taobao FileSystem)是一个高可扩展.高可用.高性能.面向互联网服务的分布式文件系统,其设计目标是支持海量的非结构化数据的存储:TFS使用C++语言开发,需要运行在64b ...
- BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法
BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...
- ll 和 ls -l的详解
ll会列出该文件下的所有文件信息,包括隐藏文件 而ls -l 只会列出显示文件 ll 命令列出的信息更加详细,有时间,是否可读写等信息 ll命令和ls -l命令结果区别: 上面结果说明: 各个字段的含 ...