Python面试,基础相关问题少不了.html
提示:
我但愿听到twisted->tornado->geventpython
答案:
gevent
代码看起来好看一些,可是维护比较差,patch没有规律,并且里面封装了C,对python3的支持最差.
twisted
稳定性是最好的,可是须要较长时间的学习.对python3的支持较差.
tornado
兼容性最好.可是过于简单了,功能不强,另外没有python数据库适配器能和tornado无缝对接,所以调用数据库很麻烦,并且只支持web.mysql
提示:
这几个概念很容易混淆,建议经过边画图,边介绍的方式来表达.linux
答案:
迭代器
(Iterator)迭代器是带状态的对象,它会记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素.
生成器
(generator)生成器和装饰器是python中最吸引人的两个黑科技,生成器虽没有装饰器那么经常使用,但在某些针对的情境下十分有效.
装饰器
(Decorator)装饰器是python中最吸引人的特性,装饰器本质上仍是一个函数,它可让已有的函数不作任何改动的状况下增长功能.程序员
提示:
混淆视听,其实Python队列都是线程安全的,该问题主要考察你对队列的了解和线程安全的概念.web
答案:
线程
线程安全和非线程安全这些概念在其余的编程语言也一样使用.
所谓线程安全:就是对于多线程同时操做是是安全的而不会发生写冲突,好比python的Queue
相反非线程安全:就是多线成同时操做时会发生写冲突,好比python的其余list,set,dict
队列
Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue.这些队列都实现了锁原语,可以在多线程中直接使用.可使用队列来实现线程间的同步.
三种队列
Python queue模块有三种队列:
1.FIFO队列先进先出.(线程安全)
2.LifoQueue相似于堆,即先进后出(线程安全)
3.PriorityQueue优先级队列,级别越低,越先出来(线程安全)
队列构造函数
针对这三种队列分别有三个构造函数:
1.class Queue.Queue(maxsize) FIFO
2.class Queue.LifoQueue(maxsize) LIFO
3.class Queue.PriorityQueue(maxsize) 优先级队列
logging
logging是Python标准库里的日志模块(线程安全)面试
能够直接认为是linux,毕竟搞后端的多数是和linux打交道.redis
提示:
我但愿听到TCP粘包与分包,为何会有这种状况,应该如何解决.能讲到UDP是否会有一样状况发生更好.算法
答案:
tcp/udp的区别
TCP与UDP区别总结:
1.TCP面向链接(如打电话要先拨号创建链接);UDP是无链接的,即发送数据以前不须要创建链接
2.TCP提供可靠的服务.也就是说,经过TCP链接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
3.TCP面向字节流,其实是TCP把数据当作一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,所以网络出现拥塞不会使源主机的发送速率下降(对实时应用颇有用,如IP电话,实时视频会议等)
4.每一条TCP链接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通讯
5.TCP首部开销20字节;UDP的首部开销小,只有8个字节
6.TCP的逻辑通讯信道是全双工的可靠信道,UDP则是不可靠信道
关于分包和粘包
粘包:发送方发送两个字符串”hello”+”world”,接收方却一次性接收到了”helloworld”.
分包:发送方发送字符串”helloworld”,接收方却接收到了两个字符串”hello”和”world”.
TCP为何会分包
TCP是以段(Segment)为单位发送数据的,创建TCP连接后,有一个最大消息长度(MSS).若是应用层数据包超过MSS,就会把应用层数据包拆分,分红两个段来发送.这个时候接收端的应用层就要拼接这两个TCP包,才能正确处理数据.
TCP为何会粘包
有时候,TCP为了提升网络的利用率,会使用一个叫作Nagle的算法.该算法是指,发送端即便有要发送的数据,若是不多的话,会延迟发送.若是应用层给TCP传送数据很快的话,就会把两个应用层数据包“粘”在一块儿,TCP最后只发一个TCP数据包给接收端.
如何处理
在进行TCP Socket开发时,都须要处理数据包粘包和分包的状况.使用的语言是Python.实际上解决该问题很简单,在应用层下,定义一个协议:消息头部+消息长度+消息正文便可.sql
提示:
考验你对实际开发中遇到的常见问题,处理方式
答案:
使用netstat和awk命令来统计网络链接数netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT:表示主动关闭,经过优化系统内核参数可容易解决.
CLOSE_WAIT:表示被动关闭,须要从程序自己出发.
ESTABLISHED:表示正在通讯过多CLOSE_WAIT缘由
出现大量close_wait的现象,主要缘由是某种状况下对方关闭了socket连接,可是我方忙与读或者写,没有关闭链接.代码须要判断socket,一旦读到0,断开链接,read返回负,检查一下errno,若是不是AGAIN,就断开链接.
提示:
考验在linux开发中,服务器端处理请求的选择问题
答案:
select和epoll这两个机制都I/O复用的解决方案,select为POSIX标准中的,而epoll为Linux所特有.
更多查看
存储可能包含rdbms,nosql以及缓存等,我以mysql,redis举例
提示:
在服务器建表时字符集(Character Set)和排序规则(Collation)是必不可少的,对他了解多少,如何选择.
答案:
字符集
所谓字符集,就是用来定义字符在数据库中的编码的集合.常见的字符集有:utf8(支持中文)和ascii(不支持中文)
排序规则
数据库中的排序规则,就是用来定义字符在进行排序和比较时的一种规则.常见的以下: 1.utf8_general_ci 不区分大小写,utf8_general_cs 区分大小写.2.utf8_bin 规定每一个字符串用二进制编码存储,区分大小写,能够直接存储二进制的内容
说明:所为排序规则,就是指字符比较时是否区分大小写,以及是按照字符编码进行比较仍是直接用二进制数据比较.
总结:这边用
gbk_chinese_ci
来作例子.
字符集名字语言后缀,其中各个典型后缀的含义以下:
1._ci:不区分大小写的排序方式
2._cs:区分大小写的排序方式
3._bin:二进制排序方式,大小比较将根据字符编码,不涉及人类语言,所以_bin的排序方式不包含人类语言
所以gbk_chinese_ci
排序方式就表示:字符集为gbk,人类语言使用中文来比较大小,比较时区分大小写.
提示:
char与varchar这两个字符类型在mysql中常常碰见,正确的使用,能够提升效率与避免空间上的浪费.
答案:
存数据时的区别
char定义的是固定长度,长度范围为0-255,存储时,若是字符数没有达到定义的位数,会在后面用空格补全存入数据库中,在上例中,name实际存储在数据中的数据为'zejin '
varchar是变长长度,长度范围为0-65535,存储时,若是字符没有达到定义的位数,也不会在后面补空格,在上例subject字段中,实际存储在数据中的数据为'zejin ',固然还有一或两个字节来描述该字节长度
取数据时的区别
数据库取char的数据时,会把后面的空格所有丢弃掉,也就是说,在char中的尾部存入空格时,最后取出来都会被丢弃.而数据库在取varchar数据时,尾部空格会保留.
提示:primary key = unique + not null
答案:
Primary key与Unique Key都是惟一性约束.但两者有很大的区别:
unique Key
1.惟一键,一个表只能有一个PRIMARY KEY.
2.Primary key的1个或多个列 必须为NOT NULL,若是列为NULL,在增长PRIMARY KEY时,列自动更改成NOT NULL.
Primary key
1.主键,一个表能够有多个UNIQUE KEY
2.UNIQUE KEY 对列没有NOT NULL或NULL的特殊要求.
提示:
主要考你对表的设计与优化.能够经过使用外键的优缺点来分析该问题.
答案:
外键是什么
程序很难100%保证数据的完整性,而用外键即便在数据库服务器down机或者出现其余问题的时候,也可以最大限度的保证数据的一致性和完整性.
是否该用外键
因需而定,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全本身控制),不用外键;小系统随便,最好用外键.
外键是否须要索引
加入外键的主要问题就是影响性能,所以加入索引能加快关联查询的速度.
提示:
但愿看到你经过对二者区别和针对公司的业务类型来选择合适的表类型,这样才能发挥mysql的性能优点.
答案:
myisam与innodb是mysql的储引擎.
区别
1.InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,因此最好把多条SQL语言放在begin和commit之间,组成一个事务;
2.InnoDB支持外键,而MyISAM不支持.对一个包含外键的InnoDB表转为MYISAM会失败;
3.InnoDB是汇集索引,数据文件是和索引绑在一块儿的,必需要有主键,经过主键索引效率很高.可是辅助索引须要两次查询,先查询到主键,而后再经过主键查询到数据.所以,主键不该该过大,由于主键太大,其余索引也都会很大.而MyISAM是非汇集索引,数据文件是分离的,索引保存的是数据文件的指针.主键索引和辅助索引是独立的.
4.InnoDB不保存表的具体行数,执行select count() from table时须要全表扫描.而MyISAM用一个变量保存了整个表的行数,执行上述语句时只须要读出该变量便可,速度很快; *
5.Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;* *
选择
1.是否要支持事务,若是要请选择innodb,若是不须要能够考虑MyISAM;
2.若是表中绝大多数都只是读查询,能够考虑MyISAM,若是既有读写也挺频繁,请使用InnoDB.
3.系统奔溃后,MyISAM恢复起来更困难,可否接受;
4.MySQL5.5版本开始Innodb已经成为Mysql的默认引擎*(以前是MyISAM),说明其优点是有目共睹的,若是你不知道用什么,那就用InnoDB,至少不会差.
总结
读操做多用MyISAM
写操做多用InnoDB
提示:
鉴于建立索引须要额外的磁盘空间(,以及太多的索引会致使文件系统大小限制所产生的问题,因此对哪些字段创建索引,什么状况下使用索引,须要审慎考虑.
答案:
*索引做用
MySQL索引在MySQL数据库中,能够有效提升查询的效率,尤为是查询数据量很是大时,效果更为明显,每每能使查询速度加快成千上万倍.
索引原理
MySQL索引主要有一下几种索引类型:FULLTEXT,HASH,BTREE,RTREE,对不通类型有着不通的存储引擎,如上面提到的MyISAM,InnoDB.
使用注意
并不是全部的数据库都以相同的方式使用索引.做为通用规则,只有当常常查询索引列中的数据时,才须要在表上建立索引.索引占用磁盘空间,而且下降添加.删除和更新行的速度.在多数状况下,索引用于数据检索的速度优点大大超过它的不足之处.可是,若是应用程序很是频繁地更新数据或磁盘空间有限,则可能须要限制索引的数量.
提示:
不一样需求不一样场景有着不一样选择,通常能够redis+mysql联用,若是能够涉及memcache,mongoDB这些no sql系列加分.
答案:
redis场景
1.会话缓存(Session Cache)
用Redis缓存会话比其余存储(如Memcached)的优点在于:Redis提供持久化.
2.全页缓存(FPC)
即便重启了Redis实例,由于有磁盘的持久化
3.队列
Redis做为队列使用的操做,就相似于本地程序语言(如Python)对 list 的 push/pop 操做.
4.排行榜/计数器
集合(Set)和有序集合(Sorted Set)也使得咱们在执行这些操做的时候变的很是简单
5.发布/订阅
在社交网络链接中使用,还可做为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来创建聊天系统
redis与mysql
这二者是内存和硬盘的关系,硬盘放置主体数据用于持久化存储,而内存则是当前运行的那部分数据,CPU访问内存而不是磁盘,这大大提高了运行的速度,固然这是基于程序的局部化访问原理.
推理到redis+mysql,它是内存+磁盘关系的一个映射,mysql放在磁盘,redis放在内存,这样的话,web应用每次只访问redis,若是没有找到的数据,才去访问Mysql.
提示:
redis自己不处理分布式事物或者说它的事物很是弱,由于redis自己是单线程的.
答案:
经过Redis+Lua方案,Redis的事务对处理较复杂的业务需求很是有用.
其次,Redis中实现事务有2种方式:
1.使用MULIT,EXEC,DISCARD和WATCH等命令;
2.使用Lua脚本封装多个redis基本命令,来实现一个复杂的事务操做.
3.DISCARD指令就是用来回滚的.
提示:
须要你描述解决该问题的过程(原由-分析-排查-解决)
答案:
当内存满了,不容许再存数据,会出现错误OOM command not allowed when used memory > ‘maxmemory’
Web安全与咱们平时开发到处关联,那么web开发须要在工做中注意哪些安全方面的问题?
<h4 id="4.1">4.1安全</h4>
提示:
对于一个有经验的开发人员,代码的书写规范是门必修课,这里考的就是程序员对书写sql语句中是否注意书写规范.
答案:
sql不由是Python中须要防范的问题,在其余语言也是个必不可少的问题,这里引用PHP的防注入方案.
1.过滤掉一些常见的数据库操做关键字:select,insert,update,delete,and,*等.或者经过系统函数:addslashes(须要被过滤的内容)来进行过滤.
2.SQL语句书写的时候尽可能不要省略小引号(tab键上面那个)和单引号.
3.提升数据库命名技巧,对于一些重要的字段根据程序的特色命名,取不易被猜到的.
4.对于经常使用的方法加以封装,避免直接暴漏SQL语句.
5.控制错误信息.
关闭错误提示信息,将错误信息写到系统日志.
6.使用Mysqli和PDO链接mysql数据预处理.
django.middleware.csrf.CsrfViewMiddleware
这个中间件.csrf_token
的tag.csrf_token
这个 tag,从而自动为表单添加一个名为csrfmiddlewaretoken
的 input.提示:
但愿能够讲到里面使用了哪些加密算法
答案:
Https是一种基于SSL/TLS的Http协议,全部的http数据都是在SSL/TLS协议封装之上传输的.
Https协议在Http协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议.
1.HTTP协议运行在TCP之上,全部传输的内容都是明文,客户端和服务器端都没法验证对方的身份.
2.HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS运行在TCP之上.全部传输的内容都通过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密.
提示:
从安全与性能方向回答.
答案:
优势
1.使用 HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
2.HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输.身份认证的网络协议, 要比 http 协议安全,可防止数据在传输过程当中不被窃取.改变,确保数据的完整性.
3.HTTPS 是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增长了中间人攻击的成本.
缺点
1.HTTPS 协议的加密范围也比较有限,在黑客攻击.拒绝服务攻击.服务器劫持等方 面几乎起不到什么做用
2.HTTPS 协议还会影响缓存,增长数据开销和功耗,甚至已有安全措施也会受到影响.
3.SSL 证书须要钱.功能越强大的证书费用越高.我的网站.小网站没有必要通常不会用.
4.HTTPS 链接服务器端资源占用高不少,握手阶段比较费时对网站的相应速度有负面 影响.
5.HTTPS 链接缓存不如 HTTP 高效.
提示:
对称加密高效不安全,非对称加密安全不高效.
答案:
对称加密
对称加密是指加密和解密使用的密钥是同一个密钥,或者能够相互推算.对称加密的优势是算法简单,加解密效率高,系统开销小,适合对大数据量加密.缺点是解密加密使用同一个密钥,须要考虑远程通讯的状况下如何安全的交换密钥,若是密钥丢失,所谓的加密解密就失效了.
非对称加密
非对称加密和解密使用的密钥不是同一密钥,其中一个对外界公开,被称为公钥,另外一个只有全部者知道,
称做私钥.
用公钥加密的信息必须用私钥才能解开,反之,用私钥加密的信息只有用公钥才能解开.