python常见面试题

    • 1、网站高并发解决方案
    • 2、python内存回收机制
    • 3、python内存优化
    • 4、flask和Django的区别
    • 5、redis介绍及优点
    • 6、事务命令
    • 7、TCP与UDP的区别
    • 8、三次握手和四次挥手
    • 9、单工、半双工、全双工
    • 10、MySQL、Redis、MongoDB对比
    • 11、MySQL、Redis、MongoDB应用场景
    • 12、tcp/ip四层模型
    • 13、celery的介绍
    • 14、JWT
    • 15、token在服务与客户端的交互流程
    • 16、JWT和session
    • 17、CSRF防御策略
    • 18、redis数据类型
    • 19、django中间件
    • 20、flask渲染模板
    • 21、前后端分离的优缺点
    • 22、restful
    • 23、restful设计方法
    • 24、ORM映射

1、网站高并发解决方案

(1)、图片服务器
(2)、代码优化 避免多层循环,避免多次访问数据库,使用多线程
(3)、数据库优化
(4)、缓存
(5)、负载均衡
(6)、CDN加速
(7)、集群和分布式
(8)、页面静态化
(9)、反向代理

2、python内存回收机制

(1)、垃圾回收
(2)、引用计数
(3)、内存池机制

3、python内存优化

(1)、手动垃圾回收,手动删除不需要的内存资源
(2)、调高垃圾回收阈值,尽量使用内存池机制
(3)、优化代码避免循环引用

4、flask和Django的区别

(1)、flask
    (a)、轻量级web框架,只有一个内核,默认依赖两个外部库,jinja2模板引擎和werkzeug WSGI工具集,自由、灵活、可扩展性强
    (b)、适用于做小型网站以及web服务的API,开发大型网站无压力
    (c)、与关系型数据库结合不弱于Django,与非关系型数据库的结合远远优于Django

(2)、Django
    (a)、重量级web框架,功能齐全,提供一站式解决的思路,能让开发者不用在选择应用上花费大量时间
    (b)、自带ORM(Object-Relational Mapping 对象关联映射)和模板引擎,支持JinJa等非官方模板引擎,灵活度不高 
    (c)、自带ORM使Django和关系型数据库耦合度过高,如果要使用非关系型数据库,需要使用第三方库 
    (d)、自带数据库管理app 
    (e)、成熟、稳定、开发效率高、相对于Flask,Django的整体封闭性比较好,适合做企业级网站的开发 
    (f)、python web框架的先驱,第三方库丰富 
    (g)、上手容易,开发文档详细、完善、资料丰富

5、redis介绍及优点

(1)、redis是key-value nosql数据库。
(2)、优点:
    (a)、异常快速
    (b)、支持丰富的数据类型(列表、集合、哈希)
    (c)、操作都是原子的

6、事务命令

(1)、mysql
    (a)、BEGIN 开启事务
    (b)、COMMIT 提交事务
    (c)、ROLLBACK 回滚事务
(2)、redis
    (a)、MULTI 开始事务
    (b)、EXEC 提交事务
    (c)、DISCARD 回滚事务

7、TCP与UDP的区别

1、TCP
    (a)、面向连接
    (b)、可靠
    (c)、有序
    (d)、无界
    (e)、流量控制
    (f)、传输慢
    (g)、重量级
    (h)、需要资源多
    (i)、应用场景(可靠性较高的场景,http,ftp)
2、UDP
    (a)、无连接
    (b)、不可靠
    (c)、无序
    (d)、有界
    (e)、无流量控制
    (f)、传输快
    (g)、轻量级
    (h)、需要资源少
    (i)、应用场景(实时性较高的场景,视频直播,大文件传输)

8、三次握手和四次挥手

1、三次握手
    (a)、第一次:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认
    (b)、第二次:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
    (c)、第三次:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。 

2、四次挥手
    (a)、第一次:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。 
    (b)、第二次:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。 
    (c)、第三次:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。 
    (d)、第四次:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。 

9、单工、半双工、全双工

1、单工:单工数据传输只支持数据在一个方向上传输
2、半双工:半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信; 
3、全双工:全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。 

10、MySQL、Redis、MongoDB对比

1、MySQL
    (a)、使用c和c++编写,并使用了多种编译器进行测试,保证源代码的可移植性
    (b)、支持多种操作系统
    (c)、为多种编程语言提供可API
    (d)、支持多线程,充分利用CPU资源 
    (e)、优化的SQL查询算法,有效的提高查询速度
    (f)、提供多语言支持,常见的编码如:GB2312、BIG5、UTF8
    (g)、提供TCP/IP、ODBC和JDBC等多种数据库连接途径 
    (h)、提供用于管理、检查、优化数据库操作的管理工具
    (i)、大型的数据库。可以处理拥有上千万条记录的大型数据库 
    (j)、支持多种存储引擎
    (k)、MySQL软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库
    (l)、MySQL使用标准的SQL数据语言形式
    (m)、Mysql是可以定制的,采用GPL协议,你可以修改源码来开发自己的MySQL系统
    (n)、在线DDL更改功能
    (o)、复制全局事务标识
    (p)、复制无崩溃从机 
    (q)、复制多线程从机
2、Redis
    (a)、Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    (b)、Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,在set,hash等数据结构的存储。
    (c)、Redis支持数据的备份,即master-slave模式的数据备份
    (d)、性能极高- Redis能读的速度是110000次/s,写的速度是81000次/s
    (e)、丰富的数据类型-Redis支持二进制案例的Strings,Lists,Hashes,Setes及Ordered Sets数据类型操作。
    (f)、原子 - Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
    (g)、丰富的特性 - Redis还支持publish/subscribe,通知,key过期等等特性。
3、MongoDB
    (a)、模式自由:可以把不同结构的文档存储在同一个数据库里
    (b)、面向集合的存储:适合存储JSON风格文件的形式
    (c)、完整的索引支持,对任何属性可索引
    (d)、复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目的是提供冗余及自动故障转移
    (e)、自动分片:支持水平的数据库集群,可动态添加额外的机器 
    (f)、丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式额标记,可轻易查询文档中的内嵌的对象及数组
    (g)、快速就地更新:查询优化器会分析查询表达式,并生成一个高效的查询计划 
    (h)、高效的传统存储方式:支持二进制数据及大型对象

11、MySQL、Redis、MongoDB应用场景

1、MySQL
    (a)、高度事务性的系统。例如银行或者会计系统,传统的关系型数据库目前还是更实用于需要大量原子性复杂事务的应用程序 
    (b)、传统的商业智能应用,针对特定问题的BI数据库会对产生高度优化的查询方式,对于此类应用,数据仓库可能是更合适的选择
2、Redis
    (a)、用来做缓存-redis的所有数据时放在内存中的
    (b)、可以在某些特定应用场景下替代传统数据库–比如社交类的应用
    (c)、在一些大型系统中,巧妙的实现一些特定的功能:session共享、购物车
    (d)、MongoDB不支持SQL语句
3、MongoDB
    (a)、网站数据:适合实时的插入,更新与查询,并具备网站实时数据存储所需对的复制及高度伸缩 
    (b)、缓存:由于性能很高,也适合作为信息基础设施的缓存层,在系统重启之后,搭建的持久化缓存可以避免下层的数据源过载; 
    (c)、大尺寸、低价值的数据也是MongoDB的最佳选择,使用传统的关系数据库存储一些数据时可能会比较贵,再次之前很多程序员往往会选择传统的文件进行存储 
    (d)、高伸缩的场景,非常是个由数十或者数百台服务器组成的数据库 
    (e)、用于对象及json数据的存储,MongoDB的bson数据格式非常适合文档格式化的存储及查询。

12、tcp/ip四层模型

1、应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。

2、传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。

3、互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。

4、网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。

13、celery的介绍

1、架构组成
    (a)、消息中间人Broken
        消息中间人,任务调度队列,通常以独立服务形式出现。生产者消费者模式,主程序将任务放入队列,后台职程从队列中取出任务并执行。

    (b)、任务执行单元Worker,职程
        执行任务的程序,可以有多个并发。

    (c)、执行结果储存Backend
        任务的执行和主程序分开,主程序想获取任务执行的结果,就必须通过中间件储存。

14、JWT

1、简介
    将用户信息加密到token中,服务器不保存任何信息,服务器通过使用保存的密钥验证token的正确性
2、优点
    在分布式系统中,解决了单点登录的问题,session共享
3、缺点
    无法作废已颁布的令牌/不易应对数据过期
4、构成
    (a)、头部
        声明类型
        声明加密的算法
    (b)、payload
        荷载,存放有效信息的地方
    (c)、签名

15、token在服务与客户端的交互流程

1、客户端通过用户名和密码登录
2、服务器验证用户名和密码,通过生成token返回给客户端
3、客户端收到toekn后每次请求的时候都带上这个token,相当于令牌,有权访问
4、服务器接收到该token,验证token合法性,合法通过请求,不通过,返回失败

16、JWT和session

1、优点
    (a)、相比于session,无需保存在服务器,不占服务器内存开销
    (b)、无状态、可拓展性强
    (c)、支持跨域
2、缺点
    (a)、更多的空间占用
    (b)、无法作废已颁布的令牌
    (c)、不易应对数据过期
3、缺点改进
    (a)、不再使用local storage存储JWT,使用cookie
    (b)、在JWT内容中加一个随机值作为CSRF令牌,服务端将该令牌保存在cookie中
    (c)、考虑到cookie的空间限制,在JWT中尽可能放够用的认证信息,其他信息放在数据库

17、CSRF防御策略

1、验证Referer字段
2、在请求地址中添加token并验证
3、在HTTP头中自定义属性并验证

18、redis数据类型

string hash list set zset

19、django中间件

中间件就是类,请求到来到结束后,会根据自己的规则在核实的时机执行中间件中相应的方法,是一个轻量级、底层的插件系统,可以介入Django请求和响应处理过程,修改Django的输入或输出
正常:user发出请求 三个中间件M1 M2 M3 依次通过M1 M2 M3,经过路由系统 view层,处理完,通过M3 M2 M1返回
非正常:运行出错或者函数有返回值,直接跳转到最里层中间件的response方法

20、flask渲染模板

render_template

21、前后端分离的优缺点

优点:
1:最大的好处就是前端JS可以做很大部分的数据处理工作,对服务器的压力减小到最小
2:后台错误不会直接反映到前台,错误接秒较为友好
3:由于后台是很难去探知前台页面的分布情况,而这又是JS的强项,而JS又是无法独立和服务器进行通讯的。所以单单用后台去控制整体页面,又或者只靠JS完成效果,都会难度加大,前后台各尽其职可以最大程度的减少开发难度。
缺点:
1、性能问题
2、前端任务加重
3、开发速度慢

22、restful

1、每一个URL代表一种资源
2、客户端与服务器之间,传递资源的某种表现层
3、客户端通过四个HTTP动词(get、post、put、delete)对服务器资源进行操作,实现“表现层状态转化”

23、restful设计方法

1、域名 尽量将API部署在专用域名下
2、版本 应该将API版本号放入URL
3、路径 每一个网址代表一个资源
4、HTTP动词 对资源的操作,由HTTP动词表示
5、过滤信息 API应该提供参数,过滤返回结果。
6、状态码 服务器向用户返回的状态码和提示信息
7、错误信息 返回出错信息 error作为键,错误信息作为键值
8、返回结果 针对不同操作,服务器向用户返回的结果符合一些规范
9、超媒体 返回结果提供链接,连向其他API
10、返回的数据格式,尽量使用JSON,避免XML

24、ORM映射

关系对象映射
类名对应------》数据库中的表名
类属性对应---------》数据库里的字段
类实例对应---------》数据库表里的一行数据
obj.id  obj.name.....类实例对象的属性

你可能感兴趣的:(Python,面试)