celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注与实时处理的异步任务队列,同时也支持任务调度。 celery的组成
celery的架构由三部分组成,消息中间件(message borker)、任务执行单元(worker)和任务执行结果存储(task result srote)组成。
消息中间件:celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括RabbitMQ,Redis等等。任务执行单元:worker是celery提供的任务执行单元,worker并发的运行在分布式的系统节点中。
系统节点:
点对点系统:系统中的单个节点无法预知系统全局状态的情况下,通过反馈感知系统整体的状态。节点利用节点与节点之间的信息交流进行自我调整,使自己处在动态的变化之中,和系统中的其他节点构成共生的关系。
流量控制:点对点的信息不透明导致,所以通信双方要相互坦白,进行兜底的沟通方式。拥塞控制:点无法把握面的全局信息,每个点只能尽自己最大的可能进行自我调节,根据全局反馈的信息进行自适应调节,所以调节的效果一般都是慢半拍 中心化系统:一般公司自己的架构的微服务体系都是中心化的,并不是像TCP/IP协议那样面向的完全的点对点系统。所以在节点设计这块并不像点对点系统那样强调自适应性,更多的是通过控制中心整体调节,一般担任这个角色的服务都是网关。 任务结果存储:Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP,redis等。Celery多用来执行异步任务,将耗时的操作交由Celery去异步执行,比如发邮件、短信、消息推送等,还可以执行定时任务,定时执行某件事情,比如redis中的数据每天凌晨两点保存至mysql数据库,实现redis的持久化。 任务队列
任务队列是一种在线程或机器间分发任务的机制 消息队列
消息队列的输入是工作的一个单元,称为任务,独立的职程(Worker)进程持续监视队列中是否有需要处理的新任务Celery用消息通信,通常使用中间人(Broker)在客户端和职称间斡旋。这个过程从客户端向队列添加消息开始,之后中间人把消息派送给职称,职称对消息进行处理。Celery系统可能包含多个职称和中间人,以此获得高可用性和横向扩展能力。 Mysqsl Mysql优化问题 mysql优化的五个原则:
1、减少数据访问:设置合理的字段类型,启用压缩,通过索引访问等减少磁盘IO;2、返回更少的数据:只返回需要的字段和数据分页处理,减少磁盘IO及网络IO;3、减少交互次数:批量DML操作,函数存储等减少数据链接次数;4、减少服务器CPU开销:尽量减少数据库排序操作以及全表查询,较少CPU内存占用;5、利用更多资源:使用表分区,可以增加并行操作,更大限度利用CPU资源。 总结到SQL优化中,就三点:
最大话利用索引;尽可能避免全表扫描;较少无效数据的查询; SQL语句的读写优先级
mysql允许改变语句调度的优先级;改变策略的方法主要是针对只存在表锁的存储引擎,比如MyISAM、MEMROY、MERGE,对于Innodb存储引擎,语句的执行是由获得行锁的顺序决定的Mysql默认的调度策略可用总结如下:
1、写入操作优先于读取操作‘2、对某张表的写入操作某一时刻之恩呢发生一次,写入请求按照他们到达的次序来处理;3、对某张表的多个读取操作可以同时的进行。MySQL提供了几个语句调节符,允许你修改它的调度策略; SQL索引
创建索引:
建表时直接创建;用alter添加索引;create index 索引名称 on (字段名); 删除索引:
drop index;alter drop; 查看索引:
show index from tblname;show keys from tblname; 常用的五种索引类型:
普通索引;唯一索引;主键索引;组合索引;全文索引; SQL索引底层原理分析
B+Tree SQL引擎区别
InnoDB:
支持事务、支持外键、支持行锁;如果是有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况;属于索引组织表;有共享表空间存储和多表空间存储两种存储方式; MyISAM:
存储记录和文件的标准方法,不支持事务,不支持外键,如果执行大量的select,建议使用MyISAM;属于堆表; 两个引擎的不同;
主键要求不同;自增长逻辑不同;count()函数执行逻辑不同;全文索引不同;delete from table逻辑不同;索引保持位置不同表的结构不同;存储方式不同; 事务
什么是事务:
事务包含一个或多个业务操作,这些操作要么都执行,要么都不执行。事务常被用来确保数据的一致性。 数据库事务:数据库事务通常指对数据库进行读或写的一个操作序列。
它包含有以下两个目的:
1、为数据库提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法;2、当多个应用程序并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰 系统中的事务:处理一系列业务处理的执行逻辑单元,该单元里的一系列类操作要不全部成功要不全部失败什么情况下会使用事务:
在执行一系列数据库操作时,要保证这些操作必须完全正确执行,要不就不执行,在这种情况下,适合使用事务;例如将一些数据插入到两个相关联的表中,而且不能只有一张表插入成功,在这种情况下,使用事务,无论是否插入成功,都不会对数据库造成不好的影响。 事务的四大特性
1、原子性:
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做; 2、一致性:
事务执行的结果必须是是数据库从一个一致性状态变到另一个一致性状态。因此当数据库中只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所做的修改有一部分已写入物理数据库,这是数据库就处于一种不正确的状态,或者说不一致的状态 3、隔离性:
一个事务的执行不能其它事务干扰。即一个事务的内部操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。 4、持续性:
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。 事务的隔离级别
1、读未提交:
引发脏读(读取了未提交的数据) 2、读已提交
这是大多数数据库系统默认的隔离级别,但不是Mysql默认的;只能看见已经提交事务所做的改变引发不可重复读,不可重复读意味着我们同一事务执行完全相同的select语句时可能看到不一样的结果;
导致这种情况的原因可能有:
1、有一个交叉的事务有新的commit,导致了数据的改变;2、一个数据库被多个实例操作时,同一事务的其他实例在该实例处理期间可能会有新的commit,多个commit提交时,只读一次出现结果不一致; 3、可重复读:
这是Mysql的默认事务隔离级别此级别可能出现的问题–幻读InnoDNB和Falcon存储引擎通过多版本并发控制解决了这个问题 4、可串行化:
这是最高的隔离级别;它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题;简言之,它在每个读的数据行上加上了共享锁;可能导致大量的超市现象和锁竞争 幻读:
select某记录是否存在,不存在,准备插入此纪录,但执行insert时发现此纪录已存在,无法插入,此时就发生了幻读。 脏读:
当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。 Django Django基础 django的生命周期 django中ORM中的外键关联删除
models.ForeignKey(‘Routemgr’,default=1,blank=True,null=True,on_delete=models.SET_NULL)
on_delete = models.CASCADE删除关联数据的时候,与之的关联也删除on_delete = models.DO_NOTHING删除关联数据的时候,什么操作也不做on_delete = models.PROTRCT删除关联数据的时候,引发报错on_delete = models.SET_NULL删除关联数据的时候,与之关联的只设置为空on_delete = models.SET_DEFAULT删除关联数据的时候,与之关联的只设置为默认值on_delete = models.SET删除关联数据 订单并发问题
悲观锁:
我认为我在修改一条数据的时候,另外一个人也要修改这条数据,那我们就可以在程序代码中添加一把锁,谁先拿到这把锁谁就去修改数据,没有拿到锁的人进行赌赛的等待,等到别人将锁进行释放以后,你才可以拿到这个锁,你的代码才可以往下及进行 乐观锁:
在查询数据的时候不加锁,在更新时进行判断。判断更新时的库存和之前查出的库存是否一致。 订单并发问题一般是使用锁+事务隔离等级(读已提交)HTTP 长连接、短连接- 短连接:
客户端和服务器每进行一个HTTP操作,就建立一次连接,任务结束就终端连接;当客户端再次访问这个服务器时,需要重qi新建立连接。 长连接:
当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接; HTTP/1.0中默认使用的短连接HTTP/1.1起,默认使用长连接 中间件 什么是中间件:
中间件是一个轻量级、底层的插件系统。可以介入Django的请求和响应处理过程,修改Django的输入或输出。 中间件的六个常用方法
1、初始化时调用:_init_()2、处理收到的请求前调用:process_request()3、处理视图函数前调用:process_view()4、处理模板前调用:process_template_response()5、返回相应数据之前调用:process_response()当发生异常时调用:peocess_exception() URL协议都有什么
http(s):超文本传输协议ftp:传输文件协议file:获取本地文件协议mailto:发邮件协议tel:打电话协议sms:发短信协议 Pandas pandas数据结构
series
一种类似于一维数组的对象。 dataframe:
where用法:
s = pd.Dataframe(range(5))s.where(s>=1, 10)s中大于等于1的值不动,小于1的值替换成10结果返回是与self相同的对象(数据结构相同) numpy中的where
where(条件,x,y)满足条件返回x,不满足返回y如果属于是一位数组的话返回的值是一维的索引,所以只有一组索引数组当数组是多维数组时,满足条件的数组值返回的是值的位置索引,因此会有两组索引数组来表示值的位置。 总结pd中的where返回的是值,np中的where返回的是索引 apply()、map()、applymap()三者的区别
apply()是Dataframe中的函数,它可以对Dataframe中的行或者列进行操作;applymap()是Dataframe中的函数,它对Dataframe中的所有数据进行操作;map()是python函数,它只能对Dataframe中的某列进行操作(只能是列) apply()、agg()、transform()
agg():
只做聚合操作可同时运用多个聚合函数,或为各列分配不同的聚合函数 apply():
作用对象是dataframe跟自定义函数,包括简单的求和函数以及复杂的series间的交互函数,不能重用agg()函数和python内置函数,例如sum、max、min、count等方法 transform():
对dataframe的每个series做transform操作,返回的结构与原dataframe一致不能跟自定义的series间交互函数 agg()+python内置方法的计算速度最快,其次是transform()+python内置方法。而 transform() 方法+自定义函数 的组合方法最慢,需要避免使用