Django 缓存配置Redis使用详解
一、cache介绍
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存。
缓存工作原理:缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有用户来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。
Django提供了6种缓存方式:
- 开发调试缓存
- 内存缓存
- 文件缓存
- 数据库缓存
- Memcache缓存(使用python-memcached模块)
- Memcache缓存(使用pylibmc模块)
这里不多介绍,有兴趣的可以去看看官方文档:https://docs.djangoproject.com/en/dev/topics/cache/
二、Redis缓存
要想在Django配置Redis缓存,则需要先安装依赖:
pip3installdjango-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):
fromdjango.shortcutsimportHttpResponse
fromdjango_redisimportget_redis_connection
defindex(request):
r=get_redis_connection("default")
r.hmset("name_a",{"key_a":"value_a","key_b":"value_b"})
returnHttpResponse("设置redis")
deforder(request):
r=get_redis_connection("default")
val=r.hmget("name_a",["key_a","key_b"])
print(val)#[b'value_a',b'value_b']
returnHttpResponse("获取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实例特有的其他字符串,以防止发生密钥冲突。如果你不在乎,请使用空字符串。
测试
fromdjango.shortcutsimportHttpResponseimporttime
defindex(request):
t=time.time()
returnHttpResponse("时间:{}".format(str(t)))
defhome(request):
t=time.time()
returnHttpResponse("时间:{}".format(str(t)))
可以发现,index或者home页面第一次返回的时间是多少,往后10分钟以内,时间都是不变的。
单独视图缓存(记得取消全站缓存中间件配置)
fromdjango.shortcutsimportHttpResponse
fromdjango.views.decorators.cacheimportcache_page
importtime
@cache_page(60*10)
defindex(request):
t=time.time()
returnHttpResponse("时间:{}".format(str(t)))
defhome(request):
t=time.time()
returnHttpResponse("时间:{}".format(str(t)))
这次,index页面第一次访问返回的时间需要过10分钟再次访问才能变化,而home页面返回的时间是时时刻刻变化的。
模板局部视图使用
#1.引入TemplateTag
{%loadcache%}
#2.使用缓存
{%cache600name%}#缓存超时(秒)和缓存片段的名称(名称按原样使用)
缓存内容
{%endcache%}
示例:
#views.py
fromdjango.shortcutsimportrender
importtime
defindex(request):
t=time.time()
returnrender(request,"index.html",{"t":t})
#index.htmlTitle {%loadcache%} {%cache10current_time%}{{t}}
{%endcache%}