pipeline、异步方案 redis 和Celery、页面静态化

pipeline

Redis的 C - S 架构:
基于客户端-服务端模型以及请求/响应协议的TCP服务。客户端向服务端发送一个查询请求,并监听Socket返回。通常是以阻塞模式,等待服务端响应。

  • 问题:
    如果Redis服务端需要同时处理多个请求,加上网络延迟,那么服务端利用率不高,效率降低。
  • 解决的办法:
    管道 pipeline
    在这里插入图片描述

pipeline 的介绍

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

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

pipeline 操作 Redis 数据库

# 创建 Redis 管道
pl = redis_conn.pipeline()

# 将 Redis 请求添加到队列
pl.setex('sms_%s' % mobile, 300, sms_code)
pl.setex('send_flag_%s' % mobile, 60, 1)

# 执行请求, 这一步千万别忘了
pl.execute()

异步方案 redis 和 Celery

在这里插入图片描述

生产者消费者设计模式

中间人(broker)搭桥,保证两个业务没有直接关联.
这一解耦方式为:生产者消费者设计模式
在这里插入图片描述
执行的流程:
在这里插入图片描述
生产者生成消息,缓存到消息队列中,消费者读取消息队列中的消息并执行。
由美多商城生成发送短信消息,缓存到消息队列中,消费者读取消息队列中的发送短信消息并执行。

Celery 介绍和使用

问题:
消费者取到消息之后,要消费掉(执行任务),需要我们去实现。
任务可能出现高并发的情况,需要补充多任务的方式执行。
耗时任务很多种,每种耗时任务编写的生产者和消费者代码有重复。

  • 借助成熟的工具 Celery 来完成

介绍

celery 是一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行.
特点:
单个 Celery 进程每分钟可处理数以百万计的任务.
通过消息进行通信,使用消息队列( 中间人或broker )在生产者和消费者之间进行协调。

安装

celery中文

# 安装到虚拟环境
pip install Celery

创建实例并且配置

  1. 定义 Celery 包
    在外层 project 增加一个包, 名字叫做: celery_tasks
  2. 创建 Celery 实例
    在 celery_tasks 包中添加 main.py 文件
# 从你刚刚下载的包中导入 Celery 类
from celery import Celery
# 利用导入的 Celery 创建对象
celery_app = Celery('projecthaha')
  1. 加载 Celery 配置
    在 celery_tasks 包中再添加一个 config.py 文件:
# 如果使用 redis 作为中间人
# 需要这样配置:
broker_url='redis://127.0.0.1:6379/3'

# 如果使用别的作为中间人, 例如使用 rabbitmq
# 则 rabbitmq 配置如下:
broker_url= 'amqp://用户名:密码@ip地址:5672'

# 例如: 
# meihao: 在rabbitq中创建的用户名, 注意: 远端链接时不能使用guest账户.
# 123456: 在rabbitq中用户名对应的密码
# ip部分: 指的是当前rabbitq所在的电脑ip
# 5672: 是规定的端口号
broker_url = 'amqp://hahahh:123456@172.16.238.128:5672'

在 celery_tasks.main.py 中, 额外增加如下代码:

from celery import Celery

celery_app = Celery('meiduo')

# 将刚刚的 config 配置给 celery
# 里面的参数为我们创建的 config 配置文件:
celery_app.config_from_object('celery_tasks.config')

定义任务

注册任务:
需要在 celery_tasks 包下, 再创建一个包,
例如, 这里为 sms.
创建好后, 需要在里面添加一个 tasks.py 文件.
注意, 这里的 tasks 名字是规定死的
在 celery_tasks.main.py 报备刚刚创建的文件:

from celery import Celery

celery_app = Celery('meiduo')

celery_app.config_from_object('celery_tasks.config')

# 让 celery_app 自动捕获目标地址下的任务: 
# 就是自动捕获 tasks
celery_app.autodiscover_tasks(['celery_tasks.sms'])

实现任务:
已经报备之后, 在 tasks.py 中添加具体的内容
在 celery_tasks.sms.tasks.py 文件中添加如下代码:

from celery_tasks.main import celery_app

@celery_app.task(name='ccp_send_sms_code')
def ccp_send_sms_code(mobile, sms_code):
    '''该函数就是一个任务, 用于发送短信'''
    result = CCP().send_template_sms(mobile, 
                                     [sms_code, 5], 
                                     1)
    return result

调用任务
创建了一个任务, 现在就可以调用该任务了
没有使用这个任务之前, 我们发送短信调用的代码写在了
verifications.views.py 中

from celery_tasks.sms.tasks import ccp_send_sms_code

# 原来的写法:
# CCP().send_template_sms(mobile, [sms_code, 5], 1)

# 改为现在的写法, 注意: 这里的函数,调用的时候需要加: .delay()
ccp_send_sms_code.delay(mobile, sms_code)

启动消费者( celery充当 )

# 想要启动 celery 服务, 调用下面的命令行: 
cd ~/projects/meiduo_project/meiduo_mall

celery -A celery_tasks.main worker -l info

celery : 调用 celery 命令
-A : 作用是指定要启动的文件, 这个参数后面的文件会被执行.
worker : 启动的对象是 worker, 工人, 干活的人
-l : 指日志打印等级, 一般日志都是通知形式的, 即:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值