python后端开发需要学什么?

python后端开发需要学什么?,第1张

可以参考下面的路径去学习,祝你学有所成,公司最近在人工智能和自然语言处理的项目后端项目,我也是网上找了很多知识,最后给自己列了一个学习的目录,按照这个在复习并在总结,希望能帮到你:

计算机基本认知,环境搭建    python环境搭建

计算机基本认识,进制转换

python注释使用

python变量使用

python数据类型_Number

python数据类型    str字符串类型

容器类型数据list,tuple,str

容器类型数据set,dict

变量缓存机制

自动类型转换

Number强制类型转换  

python运算符的使用    容器类型数据强制类型转换

字典强转等长二级容器

运算符_算数_比较

运算符_赋值_成员

运算符_身份_逻辑

运算符_位运算_优先级  

python流程控制    代码块

流程控制if

多项巢状分支

循环结构while

循环判断经典题

字符串的相关 *** 作  

python循环结构    

关键字continue_break_pass

for循环的遍历_range  

字符串,列表内置方法    

字符串函数

format字符串格式化

format特殊符号的使用

列表的 *** 作

列表函数  

字典,集合内置方法+文件 *** 作    

字典的相关函数

集合 *** 作_函数

文件 *** 作

文件加号模式  

函数,函数参数    文件相关函数 

函数

形参实参

默认形参_关键字形参

收集参数

命名关键字参数

全局/局部变量,闭包    return返回值

函数名的使用

局部变量_全局变量

函数的嵌套LEGB

关键字nonlocal

闭包函数  

递归,匿名函数    

locals和globals

闭包特点意义

递归含义

斐波那契_尾递归

匿名函数lambda  

迭代器,高阶函数    迭代器

高阶函数_map

高阶函数_reduce

高阶函数_sorted

高阶函数_filter  

推导式    列表推导式

推导式题

集合_字典推导式

生成器表达式

生成器函数  

内置方法,linux基本命令    内置函数

可滑动序列

面试题演练

linux安装

linux基本命令  

python模块    序列化模块

数学模块

随机模块

time模块  

python模块    os模块

os_shutil

os.path模块

计算文件夹大小

zipfile

tarfile  

导入模块包,oop面向对象认知    

import_from绝对导入

import_from相对导入(单入口)

oop面向对象

类的封装性

oop之封装,继承    类的相关 *** 作

对象和类的删除 *** 作

单继承

多继承

菱形继承

oop之多态,魔术方法    多态

魔术方法__new__

单态模式

析构方法__del__  

oop之魔术方法,异常处理    魔术方法__call__

魔术方法__str__repr__

魔术方法__bool_add_len__

了解异常

异常处理语法

主动抛出异常

装饰器  

装饰器

静态绑定方法

property 

正则表达式    单个字符匹配

多个字符匹配

匹配分组

命名分组

正则函数

正则计算器小程序

认识网络    bs_cs流程

传输数据流程

交换机和局域网的网络通讯

arp协议  

认识tcp/udp协议  

tcp基本语法

tcp循环发消息

udp基本语法

udp循环发消息

黏包  

基于tcp协议下的应用    socketserver并发

文件校验

服务器合法性校验

tcp登录

并发编程之进程    进程

join

守护进程

lock锁

Semaphore

生产者消费者模型    Event事件

进程队列Queue

生产者和消费者模型

JoinableQueue

Manager.py

并发编程之线程

.线程

用类定义线程

守护线程

lock保证线程数据安全

信号量_Semaphore

死锁,互斥锁,递归锁

线程池,进程池,协成的使用

事件Event

线程队列

进程池和线程池

回调函数

协程

协程的爬虫案例

mysql安装(linux+windows+xshell+navicat)  

掌握数据库mysql基本 *** 作

mysql登录,服务启动

创建账户,用户授权

数据库,数据表,数据的增删改查

认识常用数据类型  

数据库的存储引擎和约束  

字段约束

约束的删减

存储引擎区别用法

数据表之间的关系  

查询数据表  

单表查询

多表联查

子查询

带EXISTS关键字的子查询

python *** 作mysql  

python连接mysql的事务处理

sql注入

python连接mysql增删改查

mysql数据恢复  

HTML/CSS    html文档介绍,html标签,body标签,head标签介绍,head标签中的meta标签和link标签和title标签介绍,body中的标签分类,基础标签,img、a、列表、表格、input、label、select等标签,作业讲解,form标签介绍和示例讲解,css介绍,引入,css选择器,背景设置,高度宽度,字体效果,边框、盒子模型、display属性、float属性等  

CSS    伪类选择器,文字装饰、a标签补充、定位、权重、小米商城导航栏讲解,原型头像示例讲解  

JS基础/BOM和DOM *** 作    小米商城作业,js介绍和js引入,js数据类型、流程控制、函数等 *** 作,js中的JSON,BOM对象的d框、location对象、定时器、直接查找选择器、间接查找选择器、值 *** 作、类值 *** 作、样式 *** 作、button按钮补充、事件和绑定事件的两种方式,常用事件练习  

jQuery/Bootstrap    作业讲解,jquery介绍,引入、选择器、筛选器、值 *** 作、文档 *** 作、删除和清空标签、逻辑运算符、克隆、事件冒泡和事件委托、绑定事件的方式,作业讲解和模态对话框示例,input事件和页面载入事件补充、bootstrap介绍和引入、全局css样式、组件和常用插件

自定义web框架    作业讲解、web框架介绍、自定义web框架实现、动态页面、返回不同的html页面、函数版、多线程版、返回静态文件版,wsgiref版等web框架通过socket来实现,还有jinja2的简单使用  

django下载安装和URL路由系统    django介绍、MTV和MVC框架介绍、常用指令、目录结构、pycharm创建django项目、request的常用属性介绍、登录示例、url路由系统介绍、有名分组和无名分组,  

视图/模板    request对象的常用方法和属性、响应方法介绍和使用,CBV和FBV、CBV和FBV加装饰器,CBV源码讲解,模板渲染系统介绍,语法、简单示例、内置过滤器、for循环标签、if标签、with标签、自定义过滤器和标签、模板继承等  

Dajngo的ORM(1)    orm介绍,数据库同步指令使用和流程分析、配置连接mysql模型类中的属性介绍和常用参数说明,创建表和数据、增加的两种方法、删除、更新的两种方法、查询的13个api接口  

Dajngo的ORM(2)    单表图书管理系统展示和添加作业讲解、choices属性、auto_now_add和auto_now参数讲解、url别名和反向解析,基于双下划线的模糊查询,多表结构介绍,图书管理系统编辑和删除作业讲解、多表关系模型类创建和字段说明和参数介绍、多表数据的添加 *** 作,多表的删除和修改、基于对象的跨表查询、双下划线跨表查询、查看原生sql语句的方法、聚合查询、分组查询、F查询、Q查询等  

Ajax与Django/ 中间件    ajax的介绍和简单示例,ajax登录示例、列表数据展示示例,ajax *** 作cookie的补充、中间件介绍、自定义中间件的方法、5个中间件方法的介绍和使用、基于中间件的session登录认证 

cookie、session以及用户认证组件    cookie介绍,cookie的流程解析,django *** 作cookie和其他参数介绍、session的说明、django的session *** 作等,多表图书管理系统作业讲解  

vue初识、es6基本语法、指令系统    let、const、v-if、v-for、v-html、v-text、v-model、v-show、生命周期钩子函数、  

组件化开发、组件传值、axios简单使用    组件化开发、组件传值、axios简单使用、vue-router使用、vue-cli安装  

项目初始化/首页    项目介绍、创建、初始化、element-ui的使用,单文件组件的使用和axios在单文件中的使用和配置、vue-cli的介绍和使用、路飞项目顶部导航栏页面效果搭建,轮播图组件的使用和调整、购物车页面搭建和课程详情页面搭建,vue-video-player视频播放插件  

drf组件    序列化器、drf简单示例、restful规范、反序列化的校验机制  

drf组件    apiview、request和response对象、modelserializer、序列化器保存数据、read_only和write_only的参数  

drf组件    viewset、drf路由功能、viewset视图基类的使用、视图子类、通用视图类genericapiview/排序、django-filter过滤器、频率组件、分页组件、接口文档、异常处理、xadmin的安装和使用、认证组件和权限组件  

git、消息队列    git企业中的使用模式,rabbimq消息队列的应用  

rpc通信,grpc组件    rpc的概念以及通信模式,最火的grpc组件使用 

轻量级Flask框架    Werkzeug服务介绍、Flask框架介绍  

路由系统、自定义路由扩展  

Cookie、Session、Http请求和响应  

蓝图、消息闪现、中间件  

Flask常用扩展、WTForms、使用SQLAchemy ORM  

Admin、Restful、websocket原理、magic string, payload len,masking key   

请求和上下文、多app应用、离线脚本、自定义扩展 

服务端项目搭建,项目配置(session、数据库、日志相关),项目初始化  

jsonrpc模块基本配置和使用,客户端展示首页及登录注册叶绵,APICloud页面控制管理

python进阶    并发、同步、异步、锁,线进程概念以及协程实现原理  

mysql进阶课    基础知识梳理、索引、执行计划  

mysql进阶课    存储引擎、日志管理、备份恢复、主从赋值、优化  

redis,mongodb    事务和发布订阅、RDB和AOF持久化、缓存击穿、缓存雪崩等原理介绍、 用户管理和复制集(RS)总结、sharding cluster 分片集群的搭建、分片使用和相关策略等  

算法与设计模式    链表、二叉树、常见算法、二分查找、插入排序、希尔排序、快排、堆排序、哈希查找  

算法与设计模式    设计模式,单例模式、工厂模式、策略模式、观察者模式  

算法与设计模式    leetcode经典算法解析  

知识体系差不多就这么多了,再就是项目部分,具体项目要看需求了,学会了钓鱼的方法,不怕钓不到鱼哦,无论在哪个行业做什么样的项目都没问题呢!

我自己也搜集了一些经典的资料,要是想要加我百度网盘:艾美电商,我发给你!

一,什么是mysql分表,分区

什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法

什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上

一,先说一下为什么要分表

当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。

根据个人经验,mysql执行一个sql的过程如下:

1,接收到sql2,把sql放到排队队列中 3,执行sql4,返回执行结果。在这个执行过程中最花时间在什么地方呢?第一,是排队等待的时间,第二,sql的执行时间。其实这二个是一回事,等待的同时,肯定有sql在执行。所以我们要缩短sql的执行时间。

mysql中有一种机制是表锁定和行锁定,为什么要出现这种机制,是为了保证数据的完整性,我举个例子来说吧,如果有二个sql都要修改同一张表的同一条数据,这个时候怎么办呢,是不是二个sql都可以同时修改这条数据呢?很显然mysql对这种情况的处理是,一种是表锁定(myisam存储引擎),一个是行锁定(innodb存储引擎)。表锁定表示你们都不能对这张表进行 *** 作,必须等我对表 *** 作完才行。行锁定也一样,别的sql必须等我对这条数据 *** 作完了,才能对这条数据进行 *** 作。如果数据太多,一次执行的时间太长,等待的时间就越长,这也是我们为什么要分表的原因。

二,分表

1,做mysql集群,例如:利用mysql cluster ,mysql proxy,mysql replication,drdb等等

有人会问mysql集群,根分表有什么关系吗?虽然它不是实际意义上的分表,但是它启到了分表的作用,做集群的意义是什么呢?为一个数据库减轻负担,说白了就是减少sql排队队列中的sql的数量,举个例子:有10个sql请求,如果放在一个数据库服务器的排队队列中,他要等很长时间,如果把这10个sql请求,分配到5个数据库服务器的排队队列中,一个数据库服务器的队列中只有2个,这样等待时间是不是大大的缩短了呢?这已经很明显了。所以我把它列到了分表的范围以内,我做过一些mysql的集群:

linux mysql proxy 的安装,配置,以及读写分离

mysql replication 互为主从的安装及配置,以及数据同步

优点:扩展性好,没有多个分表后的复杂 *** 作(php代码)

缺点:单个表的数据量还是没有变,一次 *** 作所花的时间还是那么多,硬件开销大。

2,预先估计会出现大数据量并且访问频繁的表,将其分为若干个表

这种预估大差不差的,论坛里面发表帖子的表,时间长了这张表肯定很大,几十万,几百万都有可能。 聊天室里面信息表,几十个人在一起一聊一个晚上,时间长了,这张表的数据肯定很大。像这样的情况很多。所以这种能预估出来的大数据量表,我们就事先分出个N个表,这个N是多少,根据实际情况而定。以聊天信息表为例:

我事先建100个这样的表,message_00,message_01,message_02..........message_98,message_99.然后根据用户的ID来判断这个用户的聊天信息放到哪张表里面,你可以用hash的方式来获得,可以用求余的方式来获得,方法很多,各人想各人的吧。下面用hash的方法来获得表名:

查看复制打印?

<?php

function get_hash_table($table,$userid) {

$str = crc32($userid)

if($str<0){

$hash = "0".substr(abs($str), 0, 1)

}else{

$hash = substr($str, 0, 2)

}

return $table."_".$hash

}

echo get_hash_table('message','user18991')//结果为message_10

echo get_hash_table('message','user34523') //结果为message_13

?>

说明一下,上面的这个方法,告诉我们user18991这个用户的消息都记录在message_10这张表里,user34523这个用户的消息都记录在message_13这张表里,读取的时候,只要从各自的表中读取就行了。

优点:避免一张表出现几百万条数据,缩短了一条sql的执行时间

缺点:当一种规则确定时,打破这条规则会很麻烦,上面的例子中我用的hash算法是crc32,如果我现在不想用这个算法了,改用md5后,会使同一个用户的消息被存储到不同的表中,这样数据乱套了。扩展性很差。

3,利用merge存储引擎来实现分表

我觉得这种方法比较适合,那些没有事先考虑,而已经出现了得,数据查询慢的情况。这个时候如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码,因为程序里面的sql语句已经写好了,现在一张表要分成几十张表,甚至上百张表,这样sql语句是不是要重写呢?举个例子,我很喜欢举子

mysql>show engines的时候你会发现mrg_myisam其实就是merge。

查看复制打印?

mysql>CREATE TABLE IF NOT EXISTS `user1` (

-> `id` int(11) NOT NULL AUTO_INCREMENT,

-> `name` varchar(50) DEFAULT NULL,

-> `sex` int(1) NOT NULL DEFAULT '0',

-> PRIMARY KEY (`id`)

->) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1

Query OK, 0 rows affected (0.05 sec)

mysql>CREATE TABLE IF NOT EXISTS `user2` (

-> `id` int(11) NOT NULL AUTO_INCREMENT,

-> `name` varchar(50) DEFAULT NULL,

-> `sex` int(1) NOT NULL DEFAULT '0',

-> PRIMARY KEY (`id`)

->) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1

Query OK, 0 rows affected (0.01 sec)

mysql>INSERT INTO `user1` (`name`, `sex`) VALUES('张映', 0)

Query OK, 1 row affected (0.00 sec)

mysql>INSERT INTO `user2` (`name`, `sex`) VALUES('tank', 1)

Query OK, 1 row affected (0.00 sec)

mysql>CREATE TABLE IF NOT EXISTS `alluser` (

-> `id` int(11) NOT NULL AUTO_INCREMENT,

-> `name` varchar(50) DEFAULT NULL,

-> `sex` int(1) NOT NULL DEFAULT '0',

-> INDEX(id)

->) TYPE=MERGE UNION=(user1,user2) INSERT_METHOD=LAST AUTO_INCREMENT=1

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>select id,name,sex from alluser

+----+--------+-----+

| id | name | sex |

+----+--------+-----+

| 1 | 张映 | 0 |

| 1 | tank | 1 |

+----+--------+-----+

2 rows in set (0.00 sec)

mysql>INSERT INTO `alluser` (`name`, `sex`) VALUES('tank2', 0)

Query OK, 1 row affected (0.00 sec)

mysql>select id,name,sex from user2

->

+----+-------+-----+

| id | name | sex |

+----+-------+-----+

| 1 | tank | 1 |

| 2 | tank2 | 0 |

+----+-------+-----+

2 rows in set (0.00 sec)

从上面的 *** 作中,我不知道你有没有发现点什么?假如我有一张用户表user,有50W条数据,现在要拆成二张表user1和user2,每张表25W条数据,

INSERT INTO user1(user1.id,user1.name,user1.sex)SELECT (user.id,user.name,user.sex)FROM user where user.id <= 250000

INSERT INTO user2(user2.id,user2.name,user2.sex)SELECT (user.id,user.name,user.sex)FROM user where user.id >250000

这样我就成功的将一张user表,分成了二个表,这个时候有一个问题,代码中的sql语句怎么办,以前是一张表,现在变成二张表了,代码改动很大,这样给程序员带来了很大的工作量,有没有好的办法解决这一点呢?办法是把以前的user表备份一下,然后删除掉,上面的 *** 作中我建立了一个alluser表,只把这个alluser表的表名改成user就行了。但是,不是所有的mysql *** 作都能用的

a,如果你使用 alter table 来把 merge 表变为其它表类型,到底层表的映射就被丢失了。取而代之的,来自底层 myisam 表的行被复制到已更换的表中,该表随后被指定新类型。

b,网上看到一些说replace不起作用,我试了一下可以起作用的。晕一个先

mysql>UPDATE alluser SET sex=REPLACE(sex, 0, 1) where id=2

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql>select * from alluser

+----+--------+-----+

| id | name | sex |

+----+--------+-----+

| 1 | 张映 | 0 |

| 1 | tank | 1 |

| 2 | tank2 | 1 |

+----+--------+-----+

3 rows in set (0.00 sec)

c,一个 merge 表不能在整个表上维持 unique 约束。当你执行一个 insert,数据进入第一个或者最后一个 myisam 表(取决于 insert_method 选项的值)。mysql 确保唯一键值在那个 myisam 表里保持唯一,但不是跨集合里所有的表。

d,当你创建一个 merge 表之时,没有检查去确保底层表的存在以及有相同的机构。当 merge 表被使用之时,mysql 检查每个被映射的表的记录长度是否相等,但这并不十分可靠。如果你从不相似的 myisam 表创建一个 merge 表,你非常有可能撞见奇怪的问题。

优点:扩展性好,并且程序代码改动的不是很大

缺点:这种方法的效果比第二种要差一点

三,总结一下

上面提到的三种方法,我实际做过二种,第一种和第二种。第三种没有做过,所以说的细一点。哈哈。做什么事都有一个度,超过个度就过变得很差,不能一味的做数据库服务器集群,硬件是要花钱买的,也不要一味的分表,分出来1000表,mysql的存储归根到底还以文件的形势存在硬盘上面,一张表对应三个文件,1000个分表就是对应3000个文件,这样检索起来也会变的很慢。我的建议是

方法1和方法2结合的方式来进行分表

方法1和方法3结合的方式来进行分表

我的二个建议适合不同的情况,根据个人情况而定,我觉得会有很多人选择方法1和方法3结合的方式

二,mysql分表和分区有什么区别呢

1,实现方式上

a),mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。

[root@BlackGhost test]# ls |grep user

alluser.MRG

alluser.frm

user1.MYD

user1.MYI

user1.frm

user2.MYD

user2.MYI

user2.frm

Php代码

[root@BlackGhost test]# ls |grep user

alluser.MRG

alluser.frm

user1.MYD

user1.MYI

user1.frm

user2.MYD

user2.MYI

user2.frm

简单说明一下,上面的分表呢是利用了merge存储引擎(分表的一种),alluser是总表,下面有二个分表,user1,user2。他们二个都是独立的表,取数据的时候,我们可以通过总表来取。这里总表是没有.MYD,.MYI这二个文件的,也就是说,总表他不是一张表,没有数据,数据都放在分表里面。我们来看看.MRG到底是什么东西

[root@BlackGhost test]# cat alluser.MRG |more

user1

user2

#INSERT_METHOD=LAST

Php代码

[root@BlackGhost test]# cat alluser.MRG |more

user1

user2

#INSERT_METHOD=LAST

从上面我们可以看出,alluser.MRG里面就存了一些分表的关系,以及插入数据的方式。可以把总表理解成一个外壳,或者是联接池。

b),分区不一样,一张大表进行分区后,他还是一张表,不会变成二张表,但是他存放数据的区块变多了。

[root@BlackGhost test]# ls |grep aa

aa#P#p1.MYD

aa#P#p1.MYI

aa#P#p3.MYD

aa#P#p3.MYI

aa.frm

aa.par

Php代码

[root@BlackGhost test]# ls |grep aa

aa#P#p1.MYD

aa#P#p1.MYI

aa#P#p3.MYD

aa#P#p3.MYI

aa.frm

aa.par

从上面我们可以看出,aa这张表,分为二个区,p1和p3,本来是三个区,被我删了一个区。我们都知道一张表对应三个文件.MYD,.MYI,.frm。分区呢根据一定的规则把数据文件和索引文件进行了分割,还多出了一个.par文件,打开.par文件后你可以看出他记录了,这张表的分区信息,根分表中的.MRG有点像。分区后,还是一张,而不是多张表。

2,数据处理上

a),分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。看下面的例子:

select * from alluser where id=’12′表面上看,是对表alluser进行 *** 作的,其实不是的。是对alluser里面的分表进行了 *** 作。

b),分区呢,不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表呢,还是一张表。数据处理还是由自己来完成。

3,提高性能上

a),分表后,单表的并发能力提高了,磁盘I/O性能也提高了。并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。磁盘I/O性能怎么搞高了呢,本来一个非常大的.MYD文件现在也分摊到各个小表的.MYD中去了。

b),mysql提出了分区的概念,我觉得就想突破磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。

在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。

4),实现的难易度上

a),分表的方法有很多,用merge来分表,是最简单的一种方式。这种方式根分区难易度差不多,并且对程序代码来说可以做到透明的。如果是用其他分表方式就比分区麻烦了。

b),分区实现是比较简单的,建立分区表,根建平常的表没什么区别,并且对开代码端来说是透明的。

三,mysql分表和分区有什么联系呢

1,都能提高mysql的性高,在高并发状态下都有一个良好的表面。

2,分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8674890.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存