如果不配置缓存,django默认使用local-memory缓存,就本地内存缓存。
用cache-page装饰器做一个视图缓存测试:
@cache_page(60*5)
def page_cache(request):
time.sleep(5)
return HttpResponse('cache_page')
浏览器第一次访问http://0.0.0.0:8000/polls/page_cache/,5秒后返回cache_page,300s内再次访问,会立刻返回结果。
cache-page用的local-memory默认缓存,所以redis中肯定是空的。
127.0.0.1:6379> keys *
(empty list or set)
修改默认缓存为redis:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
再次访问http://0.0.0.0:8000/polls/page_cache/后,查看redis
127.0.0.1:6379> keys *
1) ":1:views.decorators.cache.cache_header..1517a57fc33cb5df12628c4ef1a6cca5.en-us.UTC"
2) ":1:views.decorators.cache.cache_page..GET.1517a57fc33cb5df12628c4ef1a6cca5.d41d8cd98f00b204e9800998ecf8427e.en-us.UTC"
可以看出,redis中已经成功将页面缓存,有两个键。
配置多个缓存,一个默认本地内存缓存,一个redis缓存:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'OPTIONS': {
'MAX_ENTRIES': 1000,
}
},
"redis": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
修改视图:
装饰器中通过cache参数选择使用哪个缓存。
@cache_page(60*10)
#使用reids缓存
def page_cache(request,cache='redis'):
#使用默认的内存缓存
#def page_cache(request,cache='default'):
time.sleep(5)
return HttpResponse('cache_page')
如果使用默认缓存,redis为空,如果使用redis缓存,通过keys * 就能看到键值。
使用The low-level cache api
重写一个视图:
from django.core.cache import cache
from django.core.cache import caches
import random
def muti_cache(request):
#res_key=cache.get('res_key')
res_key=caches['redis'].get('res_key')
#res_key=caches['default'].get('res_key')
if not res_key:
res_key = random.randint(0,100)
cache.set('res_key','cache_key', 300)
return HttpResponse(res_key)
导入的cache就是配置的默认缓存,caches相当于全部缓存集
cache=caches['default']
通过caches['redis']选择redis缓存
浏览器第一次访问http://0.0.0.0:8000/polls/muti_cache/,返回一个随机数
300秒内再次访问,就会返回缓存设置的cache_key
查看redis已经存入res_key-cache_key键值对:
127.0.0.1:6379> keys *
1) ":1:res_key"
参考:
django-redis文档:https://django-redis-chs.readthedocs.io/zh_CN/latest/
low-level-cache-api文档:https://docs.djangoproject.com/en/2.2/topics/cache/#the-low-level-cache-api
cache-page:https://docs.djangoproject.com/en/2.2/topics/cache/#django.views.decorators.cache.cache_page
多个缓存:https://stackoverflow.com/questions/5949271/how-to-use-2-different-cache-backends-in-django/40850500#40850500