Django 缓存之配置Redis
一、cache介绍
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存。
缓存工作原理:缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有用户来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。
Django提供了6种缓存方式:
- 开发调试缓存
- 内存缓存
- 文件缓存
- 数据库缓存
- Memcache缓存(使用python-memcached模块)
- Memcache缓存(使用pylibmc模块)
这里不多介绍,有兴趣的可以去看看官方文档:https://docs.djangoproject.com/en/dev/topics/cache/
二、Redis缓存
要想在Django配置Redis缓存,则需要先安装依赖:
pip3 install django-redis
settings.py配置:
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": 100}
# "PASSWORD": "密码",
}
}
}
视图中连接(手动操作redis):
from django.shortcuts import HttpResponse
from django_redis import get_redis_connection def index(request):
r = get_redis_connection("default")
r.hmset("name_a", {"key_a": "value_a", "key_b": "value_b"})
return HttpResponse("设置redis") def order(request):
r = get_redis_connection("default")
val = r.hmget("name_a", ["key_a", "key_b"])
print(val) # [b'value_a', b'value_b']
return HttpResponse("获取redis")
三、应用
全站使用缓存
使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用 FetchFromCacheMiddleware 获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware 会将缓存保存至缓存,从而实现全站缓存。
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware', # 放在第一
# 其他中间件...
'django.middleware.cache.FetchFromCacheMiddleware', # 放在最后
] CACHE_MIDDLEWARE_ALIAS = "" # 用于存储的缓存别名
CACHE_MIDDLEWARE_SECONDS = 600 # 每个页面应缓存的秒数
CACHE_MIDDLEWARE_KEY_PREFIX = "" # 如果使用相同的Django安装在多个站点之间共享缓存,请将其设置为站点名称或此Django实例特有的其他字符串,以防止发生密钥冲突。如果你不在乎,请使用空字符串。
测试:
from django.shortcuts import HttpResponseimport time
def index(request):
t = time.time()
return HttpResponse("时间:{}".format(str(t))) def home(request):
t = time.time()
return HttpResponse("时间:{}".format(str(t)))
可以发现,index或者home页面第一次返回的时间是多少,往后10分钟以内,时间都是不变的。
单独视图缓存(记得取消全站缓存中间件配置)
from django.shortcuts import HttpResponse
from django.views.decorators.cache import cache_page
import time @cache_page(60 * 10)
def index(request):
t = time.time()
return HttpResponse("时间:{}".format(str(t))) def home(request):
t = time.time()
return HttpResponse("时间:{}".format(str(t)))
这次,index页面第一次访问返回的时间需要过10分钟再次访问才能变化,而home页面返回的时间是时时刻刻变化的。
模板局部视图使用
# 1.引入TemplateTag
{% load cache %} # 2.使用缓存
{% cache 600 name %} # 缓存超时(秒) 和 缓存片段的名称(名称按原样使用)
缓存内容
{% endcache %}
示例:
# views.py
from django.shortcuts import render
import time def index(request):
t = time.time()
return render(request, "index.html", {"t": t})
# index.html
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> {% load cache %} {% cache 10 current_time %}
<h1>{{ t }}</h1>
{% endcache %} </body>
</html>
四、使用场景说明
# 一般来说我们用 Django 来搭建一个网站,要用到数据库等。 from django.shortcuts import render
def index(request):
# 读取数据库等 并渲染到网页
# 数据库获取的结果保存到 queryset 中
return render(request, 'index.html', {'queryset':queryset})
# 像这样每次访问都要读取数据库,一般的小网站没什么问题,当访问量非常大的时候, 就会有很多次的数据库查询,肯定会造成访问速度变慢,服务器资源占用较多等问题。 #-------------------------------------------------------------------- from django.shortcuts import render
from django.views.decorators.cache import cache_page @cache_page(60 * 10) # 秒数,这里指缓存10分钟,不直接写600是为了提高可读性
def index(request):
# 读取数据库等 并渲染到网页
return render(request, 'index.html', {'queryset':queryset})
# 当使用了cache后,访问情况变成了如下:访问一个网址时, 尝试从 cache 中找有没有 缓存内容,如果需要的数据在缓存中没有缓存内容,则去数据库取,渲染返回页面,同时 将这些数据保存在缓存中,在一定时间内,当用户再次访问页面时,就没必要去数据库取 了,直接从缓存中拿到数据。
Django 缓存之配置Redis的更多相关文章
- Django缓存优化之redis
Redis 概述 Redis 是一个开源的Inmemory key-value 存储系统,性能高,很大程度上补偿了 memcached 的不足.支持多种存储类型,包括 string, list, se ...
- Django项目settings配置redis连接
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", &q ...
- Django缓存设置
由于Django构建得是动态网站,每次客户端请求都要严重依赖数据库,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...
- django 缓存 实现
由于Django构建得是动态网站,每次客户端请求都要严重依赖数据库,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...
- Django分别使用Memcached和Redis作为缓存的配置(Linux环境)
1 使用memcached 1.1 安装memcached 安装(Linux) sudo apt install memcached 启动 #方式一: service memcached start ...
- Redis使用和部分源码剖析以及Django缓存和redis的关系
0.特点: a.持久化 b.单进程.单线程 c.5大数据类型 d.用于操作内存的软件. e.虽然是缓存数据库但是可以做持久化的工作 MySQL是一个软件,帮助开发者对一台机器的硬盘进行操作 ...
- Django的几种缓存的配置
1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会 ...
- Django 缓存 使用 Redis Memcached 为网站提速
RedisRedis是一种键值对类型的内存数据库,读写内存比读写硬盘快,我们在Django里面使用Redis非常方便,下面给出详细步骤 基于Ubuntu 1. 安装Redis和django-redis ...
- Django:缓存及相关配置
缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache ...
随机推荐
- [RK3288][Android6.0] 调试笔记 --- 录音音量从HAL到APP层会变小问题【转】
本文转载自:http://blog.csdn.net/kris_fei/article/details/72783843?locationNum=9&fps=1 Platform: Rockc ...
- 21. Ext中表格自适应高度
转自:https://blog.csdn.net/happy492/article/details/6401099 1. 下面的代码中width和height的初始值为tab的开始大小,当浏览器窗口变 ...
- 2-5 原生小程序 - 语法缺点.mp4
- 【FFmpeg】FFmpeg常用基本命令(转载)
转自:http://www.cnblogs.com/dwdxdy/p/3240167.html 1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an outp ...
- Kafka详解与总结(六)
索引 稀疏存储,每隔一定字节的数据建立一条索引(这样的目的是为了减少索引文件的大小). 下图为一个partition的索引示意图: 注: 现在对6.和8建立了索引,如果要查找7,则会先查找到8然后,再 ...
- 整数类型c++
数据类型 定义标识符 占字节数 数值范围 数值范围 短整型 short [int] 2(16位) -32768-32767 -215-215-1 整型 [long] int 4(32位) -21474 ...
- MvcPager 分页控件
官方教程: http://www.webdiyer.com/mvcpager
- DP BestCoder Round #50 (div.2) 1003 The mook jong
题目传送门 /* DP:这题赤裸裸的dp,dp[i][1/0]表示第i块板放木桩和不放木桩的方案数.状态转移方程: dp[i][1] = dp[i-3][1] + dp[i-3][0] + 1; dp ...
- 模拟 URAL 1149 Sinus Dances
题目传送门 /* 模拟:找到规律分别输出就可以了,简单但是蛮有意思的 */ #include <cstdio> #include <algorithm> #include &l ...
- JSON使用讲解
前端操作json 一.JSON字符串与JSON对象的区别 1. 一个对象以“{” 开始, “}”结束. 每个“名称”后跟一个“:”(冒号):“‘名称/值’ 对”之间运用 “,”(逗号) ...