首先先要在django的虚拟环境中安装django_redis
命令如下
pip install django_redis
在django 项目的配置文件中settings.py 文件设置
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
},
},
}
然后开启redis,有两种方式启用django的cache,
站点缓存
MIDDLEWARE = [
# 站点缓存
# 'django.middleware.cach//e.UpdateCacheMiddleware',
***
页面缓存
from django.views.decorators.cache import cache_page
@cache_page(60)
def search(request):
maxLength = 9
if request.met
以上都是用django的cache的shortcut实现的
但是通过手动cache,具有更大的灵活性
from django.core.cache import cache
def user_interview(request):
key='interview'
if cache.has_key(key):
data = cache.get(key)
else:
data = get_data()
cache.set(key,data,60*60) #设置1分钟
return data
def get_data()
data = User.objects.all()
return data
#数据库缓存
# 导入需要的模块
from django.core.cache import cache
from . import models
def cache_index(change=False):
print('从redis中查询数据')
a_list = cache.get('article_list')
if a_list is None or change == True:
print('去数据库中查找数据')
a_list = models.Article.objects.all()
print('将查询到的数据加载到缓存中')
cache.set('article_list', a_list)
return a_list
!!!!使用django.core.cache.cache类,这个类有点坑!
from django.core.cache import cache
from django.http import HttpResponse
def hello(request):
key = 'skey'
value = 'svalue'
cache.set(key, value)
if key in cache:
return HttpResponse('<h1>{0}: {1}</h1>'.format(key, cache.get(key)))
else:
return HttpResponse('<h1>没有找到</h1>')
注意在这段代码运行前,需要将settings.py文件中CACHES中的decode_responses参数设置为False,这个是在网上找的(https://juejin.im/post/5d0b4488e51d45108126d257)
运行这段代码没任何问题,能写入能读取。但是!!!如果这个key-value值是别的客户端写入的呢?假如我通过redis-cli命令行工具添加了key-value,那通过cache.get(key)是取不到的,当然这段代码添加的skey-svalue在客户端执行get skey也是取不到的。
原来通过cache.set(key, value),会在key的前面拼接一个字符串":1:",也不知道为啥。所以我说这个cache是隐形巨坑。
127.0.0.1:6379> keys *
1) ":1:skey"
通过get_redis_connection()
from django_redis import get_redis_connection
from django.http import HttpResponse
def hello(request):
key = 'skey'
value = 'svalue'
conn = get_redis_connection('default')
conn.set(key, value)
if conn.get(key):
return HttpResponse('<h1>{0}: {1}</h1>'.format(key, conn.get(key)))
else:
return HttpResponse('<h1>没有找到</h1>')
使用get_redis_connection()最好把settings.py文件中CACHES中的decode_responses参数设置为True, 同时conn = get_redis_connection(‘default’)中 的’default’是settings.py文件中CACHES设置的’default’。