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

下载后解压,进入到目录 Redis-x64-3.2.100 ,运行里面的 redis-server.exe 就启动了 Redis服务,如下图所示:

channel django redis原理 django使用redis_PythonWeb

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')

测试运行截图:

第一次运行:

channel django redis原理 django使用redis_缓存_02


再次运行:

channel django redis原理 django使用redis_redis_03

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》