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%}