1.类的方法分别怎么调用,项目中在哪里可以用到
类方法分为实例方法、静态方法和类方法,后两者实际上没有区别,只不过类方法的第一个参数是代表类的对象,而静态方法没有这个参数,实例方法要用对象调用(发给对象的消息),静态方法和类方法用类就可以调用。
2.装饰器和中间件的区别
装饰器和中间件本质也是一致的,Django1.8以后官方推荐的写法中间件跟装饰器的写法是一致的,只不过中间件可以对web的请求和响应进行过滤,web的中间件更应该称为拦截过滤器
3.celery怎么写
app = celery.Celery('模块名', broker = '消息服务器的URL', backend = '存储服务的URL')
4.七牛云怎么用的 CDN是干什么的
七牛云可以用来存储静态资源,CDN可以加速对静态资源的访问
5.数据库索引
普通索引、主键索引、全文索引、唯一索引
6.中间件的种类
处理请求、处理响应、处理异常、处理视图、处理模板
7.富文本编辑器是怎么做到图片上传的,又是怎么关联到文章的(相当于就是一篇文章 (字 图片1 字 图片2)怎么让图片和文章进行关联)
富文本一般都带了支持文件上传的,只要给一个支持文件上传的url地址就可以了,图片里面加一个文章的id作为外键就可以了图片和文章就关联起来了,在存储的时候就给图片编一个号或者按照时间先后顺序生成一个时间戳就可以区分顺序了
8.缓存穿透和缓存雪崩怎么解决
缓存穿透:指查询一个数据库不存在的数据。
解决:
1.使用互斥锁排队:
业界比价普遍的一种做法,即根据key获取value值为空时,锁上,从数据库中load数据后再释放锁。若其它线程获取锁失败,则等待一段时间后重试。这里要注意,分布式环境中要使用分布式锁,单机的话用普通的锁(synchronized、Lock)就够了。这样做思路比较清晰,也从一定程度上减轻数据库压力,但是锁机制使得逻辑的复杂度增加,吞吐量也降低了,有点治标不治本。
2.接口限流与熔断、降级:
重要的接口一定要做好限流策略,防止用户恶意刷接口,同时要降级准备,当接口中的某些服务不可用时候,进行熔断,失败快速返回机制。
3.布隆过滤器:
bloomfilter就类似于一个hash set,用于快速判某个元素是否存在于集合中,其典型的应用场景就是快速判断一个key是否存在于某容器,不存在就直接返回。布隆过滤器的关键就在于hash算法和容器大小。
缓存雪崩:缓存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。严重可能导致数据库宕机。
解决:
1.也可加锁排队机制。
2.建立备份缓存,缓存A和缓存B,A设置超时时间,B不设置超时时间,先从A读缓存,A没有读B,,并且更新A缓存和B缓存。
3.设置缓存超时时间的时候加上一个随机的时间长度,比如这个缓存key的超时时间是固定的5分钟加上随机的2分钟,这样可从一定程度上避免雪崩问题
注:redis是单线程+异步IO的工作模式
9.接口怎么做限流
接口限流是配置throttle_classes
10.数据库事务
一个是事务的ACID特性,一个是事务隔离级别,对应到底层的锁机制
事务的ACID特性:
1. 原子性(atomic),事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行
2. 一致性(consistent),事务的执行结果,必须是从一个一致状态,变成另一个新的一致状态。事务的原子性保证其一致性
3. 隔离性(insulation),主要在并发时,各个事务之间互不影响。并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
4. 持久性(Duration),事务一旦提交,数据就永久的保存在数据库,它对于系统的影响是永久性的。
事务隔离级别:
1. Serializable 串行化
2. Repeatable Read 可重复读
3. Read Commited 可读已提交
4. Read Uncommited 可读未提交
锁的机制
1) 共享锁
共享锁的代号是S,共享锁的锁粒度是行或元组(多个行)。一个事务获取了共享锁之后,可以对锁定范围内的数据执行读操作。
2) 排它锁
排它锁的代号是X,排它锁的粒度与共享锁相同,也是行或元组。一个事务获取了排它锁之后,可以对锁定范围内的数据执行写操作。
3) 意向锁
意向锁是一种表锁,锁定的粒度是整张表,分为意向共享锁(IS)和意向排它锁(IX)两类。意向共享锁表示一个事务有意对数据上共享锁;意向排它锁表示一个事务有意对数据上排它锁。
使用意向锁来保护锁层次结构的底层资源,以防止其他事务对自己锁住的资源造成伤害。
意向锁可以提高性能,因为数据库引擎仅在表级检查意向锁,确定事务是否能安全地获取该表上的锁,而不需要检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。
MYSQL锁级别
1) 表级锁:直接锁定整张表,在锁定期间,其它进程无法对该表进行写操作,若是排他锁,则其它进程读也不允许。开销小,加锁快,不会出现死锁,冲突概率高,并发度低。
2) 行级锁:仅对指定的记录进行加锁,其它进程还是可以对同一个表中的其它记录进行操作。开销大,加锁慢,会出现死锁,冲突概率低,并发度高。
3) 页级锁:页级锁取了折衷,一次锁定相邻的一组记录。开销和加锁时间界于表级锁和行级锁之间,会出现死锁,并发度一般。
11.数据库的优化
1、选取最适用的字段属性
2、使用连接(JOIN)来代替子查询(Sub-Queries)
3、使用联合(UNION)来代替手动创建的临时表
4、事务
5、锁定表
6、使用外键
7、使用索引
8、优化的查询语句
9、定时的去清除不需要的数据,定时进行碎片整理(MyISAM)
10、存储过程 [模块化编程,可以提高速度]
11、读写[写: update/delete/add]分离
12、分表技术(水平分割、垂直分割)
12.高并发怎么处理
1.HTML静态化
2.图片服务器分离(七牛云云存储,CDN加速)
3.数据库集群和库表散列
4.缓存
5.镜像
6.负载均衡
13.args和*kwargs分别代表什么
*args是非关键字参数,传入元组;**kwargs是关键字参数用于字典。
14.代码审查(Review)
代码评审可以分为代码评审会议和Single Review(一对一审查),主要就是检查代码的风格、逻辑这些,可以用工具进行辅助检查 或者是用工具(单元测试、pylint检查代码风格)
15.Python的内存管理机制
就是引用计数器机制和垃圾回收机制的混合机制
垃圾回收机制:
当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾。比如某个新建对象,被分配给某个引用,对象的引用计数变为1。如果引用被删除,对象的引用计数为0,那么该对象就可以被垃圾回收。
16.Python2和Python3的区别
一、 print 从语句变为函数
原: print 1, 2+3
改为: print(1, 2+3)
二、range 与 xrange
原 : range( 0, 4 ) 结果 是 列表 [0,1,2,3 ]
改为:list( range(0,4) )
原 : xrange( 0, 4 ) 适用于 for 循环的变量控制
改为:range(0,4)
三、字符串
原: 字符串以 8-bit 字符串存储
改为: 字符串以 16-bit Unicode 字符串存储
四、try except 语句的变化
原:
try:
......
except Exception, e :
......
改为:
try:
......
except Exception as e :
......
五、打开文件
原:
file( ..... )或 open(.....)
改为:
open(.....)
六、从键盘录入一个字符串
原: raw_input( "提示信息" )
改为: input( "提示信息" )
七、bytes 数据类型