celery

Celery 是一个分布式队列的管理工具, 可以用 Celery 提供的接口快速实现并管理一个分布式的任务队列

分布式:

分布式计算是计算机科学中一个研究方向,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给多个计算机进行处理,最后把这些计算结果综合起来得到最终的结果。分布式网络存储技术是将数据分散地存储于多台独立的机器设备上。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,不但解决了传统集中式存储系统中单存储服务器的瓶颈问题,还提高了系统的可靠性、可用性和扩展性。

概括:

1.负债均衡

2.资源共享

消息队列:

1 为什么要使用消息队列

最主要得应用场景:解耦 异步 削峰

(1)解耦

传统模式:系统间得耦合度强 如系统A直接调用系统B系统C得代码,如果再有系统D接入,则系统A还要修改代码。

中间件模式:系统A将消息写入消息队列,系统B,系统C 订阅消息队列,如果再有系统D介入,直接订阅消息队列即可 系统A不必修改代码

(2)异步

传统模式:一些非必要得业务逻辑以同步得方式运行浪费时间

中间件模式:将消息写入消息队列 一些非必要得业务逻辑以异步得方式运行 提高响应速度

(3)削峰

传统模式:并发量大得时候所有请求全部到数据库,造成数据库连接异常

中间件模式:系统慢慢得按照数据库能处理得并发量从消息队列中慢慢拉去消息。在生产环境中这种短暂得高峰期积压是允许的。

2  使用消息队列的缺点

  (1) 系统的可用性降低

     消息队列会挂掉 一但挂掉 就会影响可用性

(2) 系统复杂性增加 

考虑一致性问题 保证消息不被重复消费 保证消息可靠传输

3  消息队列选型

四种主流消息队列:ActiveMQ RabbitMQ  RocketMQ  Kafka 

去ActiveMQ 社区看看MQ更新频率(几个月更新一次)

去RabbitMQ社区看看RabbitMQ的更新频率(一月两次)

Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。

消息中间件

Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等等

任务执行单元

Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。

任务结果存储

Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, redis等

安装

pip install celery

目录基本结构  注意

 main 入口文件  注意 celery是独立运行的 注册的文件包里面不能有任何导入除这个文件包之外包的语句 否则celery无法识别出任务

#导入
from celery import Celery

#创建app  可以命名
app = Celery('duanxin')

#导入配置
app.config_from_object('celery_work.config')

#注册  注意是列表形式 包含任务的文件包
app.autodiscover_tasks(['celery_work.sms'])

config 配置文件

#指定消息队列  
#消息队列是消息在传输的过程中保存消息的容器。
BROKER_URL = 'redis://127.0.0.1:6379'   # 指定broker
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/10' # 指定backend

#一般用redis或者RabbitMQ

tasks 任务文件 注意:任务文件只能叫tasks.py

from celery_work.main import app
from celery_work.sms.yuntongxun import constants
from celery_work.sms.yuntongxun.ccp_sms import ccpa


@app.task(name="xxx")#指定任务名
def send_sms(mobile,sms_code):
    ccpa().send_sms(mobile,[sms_code, constants.SMS_CODE_REDIS_EXPIRES // 60], constants.SEND_SMS_TEMPLATE_ID)

------------恢复内容开始------------

mysql常见错误代码表

https://www.cnblogs.com/wgj-master/p/7824890.html

SQL语句

SQL分类:

n 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等

n 数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert,delete,update等

n 数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户。

n 数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等

进入数据库

mysql -uroot -p

退出数据库

quit
exit
ctrl + d

查看时间

select now();

查看版本

select version();

库的操作

查看所有库

show databases;

选择库

use 库名;

查看当前使用的库

select database;

创建库

create database 库名 charset=utf8;

删除库

drop database 库名;

查看创建数据库的语句

show create database 库名;

表的操作

查看所有表

show tables;

创建表

UNSIGNED :无符号,值从0开始,无负数
ZEROFILL:零填充,当数据的显示长度不够的时候可以使用前补0的效果填充至指定长度,字段会自动添加UNSIGNED
NOT NULL:非空约束,表示该字段的值不能为空
DEFAULT:表示如果插入数据时没有给该字段赋值,那么就使用默认值
PRIMARY KEY:主键约束,表示唯一标识,不能为空,且一个表只能有一个主键。一般都是用来约束id
AUTO_INCREMENT:自增长,只能用于数值列,而且配合索引使用,默认起始值从1开始,每次增长1
UNIQUE KEY:唯一值,表示该字段下的值不能重复,null除外。比如身份证号是一人一号的,一般都会用这个进行约束
FOREIGN KEY:外键约束,目的是为了保证数据的完成性和唯一性,以及实现一对一或一对多关系
约束条件

数据类型   https://www.runoob.com/mysql/mysql-data-types.html

create table 表名(

字段名 数据类型 约束条件,

id int unsigned primary key auto_increment not null , #unsigned 要排最前面 他是形容数据类型的

name varchar(8) not null comment 'comment是注释', comment 'comment是注释
age tinyint unsigned not null default 0, gender enum("","") );

删除表

drop table 表名;

查看创表语句

show create table 表名;

 查看表结构

desc 表名;

字段操作

添加字段

alter table 表名  add 列名 类型 约束;

重命名字段(可以修改字段名和属性)

alter table 表名 change 原字段名 新字段名  类型 约束;

修改字段(只修改属性 不修改字段名)

alter table 表名 modify 字段名 数据类型 约束;

删除字段

alter table 表名 drop 字段名;

数据操作

其他功能

数据库备份与恢复

mysqldump -uroot -p 数据库名 > xxx.sql; #导出备份数据

mysql -uroot -p 新数据库名 < xxx.sql; #恢复数据

 增

insert into 表名 vlaues(1,'小明');
insert into 表名 values(null,'小红');#有自增长属性的值传null 自动会赋值

批量增加只填写部分字段的数据

insert into 表名(字段1,字段2) values(值1,值2),(值1,值2);

delete from 表名;#慎用 删除全部数据
delete from 表名 where id =1;#删除指定数据

但是一般数据库中不会用物理删除  都是用逻辑删除 创建一个is_delete的字段

改(要用到where)

update 表名 set name = '艾欧尼亚' #这样就是全部修改
#加 where 条件局部修改
update 表名 set name= '德玛西亚' where id = 2; #注意是date 不是data

查询一个表的所有字段下的数据

select * from 表名;

查询一个表的指定字段下的数据

select 字段1,字段2 from 表名; 

where(where 后面支持多种运算符 进行条件的处理)

比较运算符 

等于 =
大于 >
小于 <
大于等于 >=
小于等于 <=
不等于 !=  或 <>

select * from 表名 where id >5;

逻辑运算符

关键字  and  or    not 

#查询编号小于6 或者年龄大于18 的人

select * from 表名 where id<6 or age >18;

模糊查询

关键字 like

%表示任意多个任意字符
_表示一个任意字符

#查询姓黄的学生

select * from 表名 where name like '黄%';

范围查询

关键字  between - andin

in 表示不连续范围查询

#查询 在 1 3 5 号中有没年龄大于18 的

select * from 表名 where age >18 and id in(1,3,5);

between 表示连续范围内

#查询在1-100 号中有没有年龄大于18的

select * from 表名 where age >18 and (id between 1 and 100);
#出现两个and 记得加括号 以免混淆

#查询id 不是1-100 且 年龄大于18的
#select * from 表名 where age >18 and (not id between 1 and 100)

空判断

判断是否为空
xx  is null;
不为空
not is null;

# 查询身高为空的数据

select * from 表名 where high is null;

order排序

在查到的数据后面跟 order by 

order by 字段 asc; #升序 默认
order by 字段 desc; #降序

#查询出年龄大于18的数据 按id降序排序
select * from 表名 where age >18 order by id desc;

#查询年龄大于18的数据 按身高降序排序 身高相同的数据按id排序
select * from 表名 where age >18 order by high desc,id desc;

聚合函数(不能嵌套)

count(*)   计算总数量

select count(*) from 表名;

max(列)   求此列最大值

select max(age) from 表名;

min(列) 求此列最小值

select min(age) from 表名;

sum(列) 求此列的和

select sum(age) from 表名;

avg(列) 求此列平均值

select avg(age) from 表名;

distinct 去重

select distinct(列) from 表名;

group by分组(分类)

查看一个字段中有多少种类的数据

因为只涉及到一个字段 所有只需要查一个字段

#查询出age字段所有数据并分组
select age from 表名 group by age;

#查询出age字段所有数据并分组 并查出每组有多少数量的数据
select age,count(*) 表名 group by age;

group_concat()

#查询分组 并显示每组中的数据

select gender,gruop_concat(name)  from 表名 group by gender;

limit 分页

可以使用limit限制取出记录的数量,但limit要写在sql语句的最后面。

语法 limit 起始位置(第一个位置是0),每页记录数


select * from 表名 limit 0,3;

标准SQL书写格式顺序

select 字段1,字段2.。。

from 表名

[where 条件]

[group by 字段名]

[order by 字段名 排序规则]

[having 条件]

[limit 起始位置,数量];

关联查询

内连接(查询到笛卡尔积)

#以下的where 都可以替换为on 效果一样
select * from 表A inner join 表B;

得到一张每条A数据都有每条B数据与之对应的表

再结合where进行筛选

select * from 表A inner join 表B where A.class = B.id;

结合as别名食用更佳

select * from 表A as a inner join 表B as b  where a.class = b.id;

外连接

#将右表指定字段与左表指定字段对应 无对应字段则用null补齐

select * from A left join B on A.class = B.id;

#将左表指定字段与右表指定字段对应 无对应字段则用null补齐

select * from A right join B on A.class = B.id;

#左外连接 主表 left join 从表
#右外连接 从表 left join 主表

问题 那这样其实左右连接 把主从表换一下不就一样了?

自连接

一张表 自己的一个字段对应另一个字段

子查询

就是嵌套  把一句查询语句嵌套到另外一句里面

外键 foreign key

一个表的主键A 在另外一个表B中出现 我们说A是表B的一个外键(外键是字段和表的关系)

外键是从表某一字段的属性?

添加外键

alter table 主表名 add foreign key (字段) references 从表名(主键字段名);

------------恢复内容结束------------

原文地址:https://www.cnblogs.com/xujin247/p/11891519.html