Django使用redis实现缓存
环境搭建安装
1,安装redis服务
sudo apt-get install redis-server
2,安装django组件
sudo pip3 install django-redis
Django项目配置
settings.py
CACHES = {
"default": {
# 引擎
"BACKEND": "django_redis.cache.RedisCache",
# 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
'TIMEOUT': 300,
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
# "PASSWORD": "mysecret"
}
}
}
视图缓存:
使用缓存框架的更细化的方式是缓存单个视图的输出。django.views.decorators.cache
定义一个cache_page装饰器,它会自动缓存视图的响应
views.py
# 在需要缓存的视图上添加装饰器, 参数是设置timeout 超时时间, 单位是秒,
from django.views.decorators.cache import cache_page
@cache_page(10)
def index(request):
t = datetime.datetime.now()
return HttpResponse(t)
自定义缓存 :
例如,您的站点可能包含一个视图,其结果取决于几个昂贵的查询,其结果以不同的时间间隔进行更改。
在这种情况下,使用每个站点或每个视图缓存策略提供的全页缓存是不理想的,因为您不希望缓存整个结果(因为有些数据经常更改),但您仍然希望缓存很少更改的结果
在这样的情况下,Django提供了一个简单的,低层次的缓存API。
您可以缓存任何Python对象:字符串、字典、模型对象列表等等
基本语法: set(key, value, timeout) get(key)
from django.core.cache import cache
cache.set('my_key', 'hello, world!', 30)
cache.get('my_key')
模板缓存
您还可以使用cache模板标签来缓存模板片段。
为了让您的模板可以访问此标记,请放在模板的顶部附近。{ % load cache % }。
文档地址: https://docs.djangoproject.com/en/1.11/topics/cache/#template-fragment-caching
站点缓存:
缓存设置完成后,使用缓存的最简单方法是缓存整个网站
文档地址: https://docs.djangoproject.com/en/1.11/topics/cache/#the-per-site-cache
实验代码
配置:
# 缓存配置
CACHES = {
"default": {
# 引擎
"BACKEND": "django_redis.cache.RedisCache",
# 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
'TIMEOUT': 300,
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
# "PASSWORD": "mysecret"
}
}
}
路由:
# 缓存测试
url(r'^cache1/$', views.cache1,name="cache1"),
url(r'^cache2/$', views.cache2,name="cache2"),
视图:
import datetime
from django.views.decorators.cache import cache_page
from django.core.cache import cache
# 缓存整个视图函数
@cache_page(10)
def cache1(request):
t = datetime.datetime.now()
return HttpResponse(t)
# 在视图函数中缓存一部分内容
def cache2(request):
# 判断缓存是否存在数据
a = cache.get('time',None)
if a:
print('缓存中存在数据')
print(a)
else:
# 从模型中获取的数据
a = datetime.datetime.now()
cache.set('time',a,10)
print('缓存中,不存在数据,查询并缓存')
print(a)
# 不需要缓存的数据
t = datetime.datetime.now()
print(t)
return HttpResponse(t)