(一)Redis安装
(1)windows下安装Redis
下载安装包解压后运行redis-server.exe redis.conf即可运行
(2)linux如centos下暗装Redis
下载如下
wget http://download.redis.io/releases/redis-5.0.6.tar.gz
tar xzf redis-5.0.6.tar.gz
cd redis-5.0.6
make
make test
make install
启动
cd utils/ ; ./install_server.sh
可以注释掉 vim /etc/redis/6379.conf 的配置文件下面这三行,禁止内存数据到磁盘,如果只是把Redis作为缓存使用
save 900 1
save 300 10
save 60 10000
(2)安装django-redis
在django的settings.py中增加如下配置,可以放在database数据库下
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
location后面的6379/1的/1指的是DB number,指定redis的数据库号
(3)代码使用缓存
首先在settings的下建一个class CK:
假定我们这里有list_medicine,list_customer两个数据
记录全局的缓存key,防止重复
class CK:
# 列出药品 的 缓存 key
MedineList = 'list_medicine'
# 列出客户 的 缓存 key
CustomerList = 'list_customer'
在自己项目的Medinelist与customer两处,导入settings与redis的连接
from django_redis import get_redis_connection
from django import settings
(4)项目部分代码展示
from django_redis import get_redis_connection
from django import settings
import json
#获取一个和Redis服务的连接
rconn = get_redis_connection("default")
def list_medicine(request):
try:
#请求的参数
keywords = request.params.get(‘keywords’,None)
pagenum = request.parms.get(‘pagenum’)
pagesize = request.parms.get(‘pagesize’)
#验证是cacheobj是否有缓存
cachefield = f’{pagenum}|{pagesize}|{keywords}‘
cacheobj = rconn.hget(settings.CK.Medinelist,
cachefield)
#如果有缓存
if cacheobj:
#这个print验证加载已有缓存
print(‘加载已有缓存’)
return json.loads(cacheobj)
else:
#验证无缓存处
print(‘初次加载缓存’)
#分页,Queryset对象转换为list
pgnt = paginator(qs,pagesize)
page = pgnt.page(pagenum)
retlist = list(page)
#此处为项目传给前端的json格式
retobj = {‘ret’:0,‘retlist’:retlist,‘total’:pgnt.count}
#存入缓存
rconn.set(settings.CK.Medinelist,
cachefield,
json.dumps(retobj))
return JsonResponse(retobj)
except Emptypage:
return JsonResponse({‘ret’:0,‘retlist’:retlist,‘total’:0})
except:
print(traceback.format_exc())
return JsonResponse({'ret': 2, 'msg': f'未知错误\n{traceback.format_exc()}'})
为了验证是否为初次加载缓存,在此处修改加上 rconn.delete(settings.CK.MedineList)
if cacheObj:
print('加载已有缓存')
retobj = json.loads(cacheObj)
rconn.delete(settings.CK.MedineList)
连续访问两次该界面发现redis库已成功使用
对于增删改也同样,在返回json值的前一步加上
rconn.delete(settings.CK.MedineList)
就可以保证,在增删改一个数据后,界面的缓存得以清除以便访问时候更新缓存,避免缓存的数据与实际数据滞后、不符的现象了
同样修改另一个客户类的代码
再依次添加更改项目其它需要redis库的地方即可