Django开发之redis的使用
- 1.Windows上安装 Redis
- 2.Django项目缓存配置
- 2.1 安装django-redis库
- 2.2 配置 settings.py
- 3.代码使用缓存
- 3.1 分页查询添加redis缓存
- 3.2 缓存数据更新
- 4.完整代码下载
前言:为了提高性能,我们需要把数据库中大部分不经常变动的数据加入到缓存中,这样避免了用户浏览数据的时候,频繁访问数据库,可以提高性能。下面我们就介绍一下如何在Django中使用redis缓存!
1.Windows上安装 Redis
下载后解压,进入到目录 Redis-x64-3.2.100 ,运行里面的 redis-server.exe 就启动了 Redis服务,如下图所示:
2.Django项目缓存配置
2.1 安装django-redis库
python -m pip install django-redis -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2 配置 settings.py
注意:此配置项目是在上一个《Django开发之前后端分离快速入门》项目基础之上进行的‘。
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 记录全局的缓存key,防止重复
class CK:
# 列出学生 的 缓存 key
StudentList = 'list_student'
3.代码使用缓存
3.1 分页查询添加redis缓存
在 apps/students/student.py 文件开头处,进行如下修改
from django_redis import get_redis_connection
from django_demo import settings
rconn = get_redis_connection("default")
def liststudents2(request):
"""分页查询"""
try:
# 查看是否有 关键字 搜索 参数
keywords = request.params.get('keywords', None)
# 要获取的第几页
pagenum = request.params['pagenum']
# 每页要显示多少条记录
pagesize = request.params['pagesize']
# 先看看缓存中是否有
cacheField = f"{pagesize}|{pagenum}|{keywords}" # 缓存 field
cacheObj = rconn.hget(settings.CK.StudentList,cacheField)
# 缓存中有,需要反序列化
if cacheObj:
print('缓存命中')
retObj = json.loads(cacheObj)
# 如果缓存中没有,再去数据库中查询
else:
print('缓存中没有')
qs = Stdudent.objects.values()
if keywords:
conditions = [Q(name__contains=one) for one in keywords.split(' ') if one]
query = Q()
for condition in conditions:
query &= condition
qs = qs.filter(query)
# 使用分页对象,设定每页多少条记录
pgnt = Paginator(qs, pagesize)
# 从数据库中读取数据,指定读取其中第几页
page = pgnt.page(pagenum)
# 将 QuerySet 对象 转化为 list 类型
retlist = list(page)
retObj = {'ret': 0, 'retlist': retlist, 'total': pgnt.count}
# 存入缓存
rconn.hset(settings.CK.StudentList,cacheField,json.dumps(retObj))
return JsonResponse(retObj)
except EmptyPage:
return JsonResponse({'ret': 0, 'retlist': [], 'total': 0},charset='utf-8')
except:
return JsonResponse({'ret': 2, 'msg': f'未知错误\n{traceback.format_exc()}'},charset='utf-8')
测试运行截图:
第一次运行:
再次运行:
3.2 缓存数据更新
如果我们对数据库进行了变动,这时候我们就要通知redis从新进行缓存,所以我们只需要把缓存的数据删掉就行了。
def addstudent(request):
info = request.params['data']
try:
student = Stdudent.objects.get(name=info['name'])
except Stdudent.DoesNotExist:
student = None
if student:
return JsonResponse({'ret': 1, 'msg': '用户名已经存在'},charset='utf-8')
record = Stdudent.objects.create(name=info['name'], number=info['number'], addre=info['addre'])
rconn.delete(settings.CK.StudentList) #删掉缓存
return JsonResponse({'ret':0,'id':record.id})
同样在其他需要对数据库的数据有变动的情况下,加入删除缓存的代码即可!
4.完整代码下载
《基于django+redis的前后端分离demo》