Django中使用redis

1. 安装django-redis扩展包

pip install django-redis

django-redis使用说明文档:django-redis文档

2. settings.py文件中配置Redis数据库

CACHES = {
    "default": { # 默认
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    "session": { # session
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    "img_code": { # 包存图形验证码、短信验证码
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"

说明:

default:

  • 默认的Redis配置项,采用0号Redis库。

session:

  • 状态保持的Redis配置项,采用1号Redis库。

SESSION_ENGINE

  • 修改session存储机制使用Redis保存。

SESSION_CACHE_ALIAS:

  • 使用名为"session"的Redis配置项存储session数据

配置完成后:运行程序,测试结果。

3. redis 的使用:

from django.views import View
from verifications.libs.captcha.captcha import captcha
# 导入获取redis连接方法
from django_redis import get_redis_connection
from django import http

class ImageCodeView(View):

    def get(self, request, uuid):
        """
        图形验证码
        :param request:
        :param uuid:
        :return:
        """
        # 生成验证码
        text, img = captcha.generate_captcha()
        # 包存文本到redis
        # 获取连接,参数img_code与配置文件中对应,默认值为default
        redis_con = get_redis_connection("img_code")
        # 包存验证码到redis
        redis_con.setex(uuid, constants.IMAGE_CODE_REDIS_EXPIRES, text)
        # 响应图片
        return http.HttpResponse(img, content_type="image/jpg")

4. django使用redis优化:使用pip

Redis的 C - S 架构:

  • 基于客户端-服务端模型以及请求/响应协议的TCP服务。
  • 客户端向服务端发送一个查询请求,并监听Socket返回。
  • 通常是以阻塞模式,等待服务端响应。
  • 服务端处理命令,并将结果返回给客户端。

存在的问题:

  • 如果Redis服务端需要同时处理多个请求,加上网络延迟,那么服务端利用率不高,效率降低。

解决的办法:

  • 管道pipeline

4.1 pipeline的介绍

管道pipeline

  • 可以一次性发送多条命令并在执行完后一次性将结果返回。
  • pipeline通过减少客户端与Redis的通信次数来实现降低往返延时时间。

实现的原理

  • 实现的原理是队列。
  • Client可以将三个命令放到一个tcp报文一起发送。
  • Server则可以将三条命令的处理结果放到一个tcp报文返回。
  • 队列是先进先出,这样就保证数据的顺序性。

4.2 pipeline操作Redis数据库

1.实现步骤

1. 创建Redis管道
2. 将Redis请求添加到队列
3. 执行请求

2.代码实现

# 创建Redis管道
pl = redis_conn.pipeline()
# 将Redis请求添加到队列
pl.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
pl.setex('send_flag_%s' % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
# 执行请求
pl.execute()

 

posted @ 2021-01-25 21:21  foreast  阅读(424)  评论(0编辑  收藏  举报