1.python的数据结构有哪些,在这些数据结构中哪些是可变的,哪些是不可变的?
答:python的数据结构有:str,list,dict,bool,int,set,touple,在这些数据结构中list,dict,set为可变数据类型,其余的为不可变数据类型。
- 装饰器的作用
答:作为日志,函数计数,权限校验,缓存等。
- python的面向对象
答:面向对象的三大特性:封装,继承,多态;封装是指通过私有属性和私有方法的方式实现封装;继承是指子类拥有父类的特性,提高代码的重用性;多态指的是同一个方法不同的对象调用,产生不同的行为。
4.python的设计模式有哪些?
答:工厂模式,单例模式;工厂模式即将创建者和调用者分开,例如:电脑的组装,汽车的生产(不同的厂家生产出不同的汽车)。
5.python中什么是闭包?闭包和装饰器的区别?
答:1.函数嵌套;2.内部函数使用外部函数的变量或参数;3.外部函数返回内部函数名;装饰器——装饰器是一个闭包函数,在不修改代码的前提下,给已有函数增加额外的功能,不同点在于调用时,参数为函数类型;
6.python中的异步celery
答:Celery主要由三部分组成,消息中间件broker,任务执行单元Worker(消费者),任务执行结果存储Result;消息中间件接受生产者发送的任务信息,存进队列再分配给消费者,能做为消息中间件的有Rabbit MQ,Redis等;能做为执行结果存储Result的有Redis,RabbitMQ等。
7.python中的深拷贝和浅拷贝
答:深拷贝和浅拷贝的区别在于:当拷贝的对象中可变对象中的元素发生变化,拷贝得到的对象也会发生变化,而深拷贝则不会;
8.python中的多进程和多线程
答:1.进程是资源分配的最小单位,线程是CPU调度的基本单位;2.进程之间不共享全局变量;3.进程是并发执行的,线程是并行;4.进程是操作CPU密集型数据,线程是操作IO密集型数据;5.由于线程共享全局变量,因此会出现线程安全问题,出现脏数据,解决方法:线程等待,加锁。
9.python中全局解释器锁GIL
答:python的全局解释器锁GIL——允许一个线程持有Python解释器的控制权,因此python中的多线程的并发并不是真正的并发;
10.Django中如何实现状态保持?
答:cookie和session以及jwt;cookie和session的区别:1.cookie数据存储在客户端浏览器上,session存储在服务器上;2.session在一定时间内保存在服务器上,当访问量增加时,考虑服务器性能,使用cookie;3.session依赖cookie;4.cookie的数据存储太小,4k左右;5.cookie不安全,因此需要将一些重要的登录信息存储在session中;
jwt的原理:第一次认证通过用户名密码,服务端签发一个json格式的token。后续客户端的请求都携带这个token,服务端仅需要解析这个token,来判别客户端的身份和合法性;jwt包含三个部分:header,payload,signature;
11.python中的协程
答:1.一个线程可以有多个协程,协程是异步机制;2.协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态;一般使用gevent库,如果是非阻塞异步并发的一般都是使用协程。
12.python中TCP为什么需要等待2msl的时间?
答:1.保证客户端发送的最后一个ACK报文能够到达服务器,因为这个报文可能丢失;2.防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中;
13.为什么建立连接是三次握手,关闭连接确是四次挥手呢?
答:建立连接的时候,服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
14.如果已经建立了连接,但是客户端突然出现故障了怎么办?
答:TCP还设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
15.diango中orm和原生sql的优缺点
答:orm——对象关系映射,开发速度快,操作简单,但是处理多表联查等复杂操作,orm语法会变得复杂;sql语句开发速度慢,执行速度快,性能强。
16.django中http的执行流程
答:1.一个http请求打包成HttpRequest对象;
2.将该对象传递给Request中间件处理,如果该中间件返回了Response,则直接传递给response中间件做收尾处理;
3.Resquest中间件将访问URL配置,确定访问哪一个路由路径,但是在还没传给View视图的时候,系统会把request传递给View中间件处理器,如果该中间件返回Response,那么该Response直接传递给Response做收尾处理;
4.将执行对应的View视图并返回给Response中间件,如果在这个过程中发生异常并抛出错误,会传递给Exception中间件处理;否则返回视图模板结束。
17.django中的中间件有哪些
答:1.process_request;
2.process_view;
3.process_response;
4.process_exception;
5.process_template
18,django中的CSRF(跨站请求伪造)
答:用户登录了正常的网站A, 然后再访问某恶意网站,该恶意网站上有一个指向网站A的链接,那么当用户点击该链接时,则恶意网站能成功向网站A发起一次请求,实际这个请求并不是用户想发的,而是伪造的,而网站A并不知道。攻击者利用了你的身份,以你的名义发送恶意请求,比如:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账等。
19.django中的FBV和CBV
答:FBV——在视图里面使用函数处理请求;CBV——在视图里面使用类处理请求(提高代码复用性,针对不同的HTTP请求,不需要通过if判断,提高代码的可读性)
20.mysql的更新流程(update)
答:1.从buffer pool中查看是否有这条数据,如果不存在,就从磁盘中加载到缓冲池,然后对这行记录进行加锁;2.将更新记录的旧值写入到undolog中以便回滚;3.更新buffer pool中的数据;4.执行器把数据的修改写入到redolog中;5.在提交事务时,会将redolog写入到磁盘中;6.执行器会生成更新的binlog,然后写入到磁盘binlog文件中;7.执行器将本次更新对应的binlog文件写入都redolog中,同时在redolog中写入一个commit标记;
21.Python中的三大器(迭代器,生成器,装饰器)
答:迭代器——对可迭代对象就行迭代的方式,并且记录当前迭代进行到的位置;可迭代对象指的是实现__iter__和__next__方法;通过内置函数next或实例对象的__next__方法,获取当前迭代的值;迭代器一定是可迭代对象,可迭代对象不一定是迭代器;如果可迭代对象遍历完后继续调用next(),则会抛出:StopIteration异常。
生成器——一边循环一边计算的机制,被称为生成器,想要得到庞大的数据,又想让它占用空间少,那就用生成器;生成器的实现方法——1.还有yiel关键字;2.使用生成器推导式;
生成器的工作原理:1.生成器迭代的关键是含有next()方法;重复调用next()方法,直到捕获一个异常;2.yield记录返回位置,下次迭代代码从yield的下一句执行
22.微服务的优缺点
答:优点:解耦,服务拆分,当有一个服务宕机时,不会影响其他的服务运行,可以保证主业务的流程;缺点:架构复杂,开发难度较大,数据聚合很难;如果想要聚合两个服务之间的数据,可以使用数仓的模式;
23.如何确保同一网站不能同时登陆
答:单点登录;将微信unionid,手机号关联同一个账号,每次登录时,只需要判断该用户是否存在即可;
24.JWT在什么情况下使用?
答:首先http协议是一种无状态的协议,不能记录用户当前状态,因此引入了cookie和session,cookie存储在浏览器,session存储在服务器端,session需要依赖cookie,会将sessionid存储在cookie中,如果用户过多就会需要去维护,并且需要删除一些过期数据,效率太低,因此引入了jwt,jwt包含三部分:headers,payload,signature;其实jwt是一种加密手段,使用jwt只需要用户在登录时,携带生成的token值,服务端会使用加盐模式进行解密;
25.mysql的存储引擎都有哪些?
答:Innodb,MyIsam,Memory;
Innodb支持外键,支持事务;MyIsam不支持外键,不支持事务;
Innodb和MyIsam采用的是B+Tree,Memory采用的是Hash索引;
26.数据库的优化方式
答:1.在进行表设计时,可适度增加冗余字段(反范式设计),减少JOIN操作;
2.多字段表可以进行垂直分表优化,多数据表可以进行水平分表优化;
3.选择恰当的数据类型,如整型的选择;
4.对较频繁的作为查询条件的字段创建索引;唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件;更新非常频繁的字段不适合创建索引;
5.编写SQL时使用上面的方式对SQL语句进行优化;
6.使用慢查询工具找出效率低下的SQL语句进行优化;
7.构建缓存,减少数据库磁盘操作;
8.可以考虑结合使用内存型数据库,如Redis,进行混合存储。