首行占位
Python相关
1.Python3特性和变化
1.Python3默认编码是UTF-8,2为ASCII
2.Python3中只有int,2中有int跟long,其中int不能超过sys.maxint
3.Python3中print是一个函数,需要带括号,2中不需要
4.Python3中input接收到的是str,2中接受到的是int(raw_input接受str)
5.Python3中range返回的是可迭代对象(节省内存),2中是列表
2.GIL
全局解释器锁,作用是保证一个进程同一时刻只有一个线程在运行
产生原因:Python的线程是调用C语言的原生线程,当线程执行之后python解释器就无法对其进行控制,解决多线程之间数据完整性和状态同步,就有了GIL锁
释放时机:线程开始IO操作,解释器每隔100opcode(操作码)或15ms
3.解释器
1.CPython:应用最广泛
2.IPython:基于CPython,增强交互体验
3.PyPy:执行速度快(对代码进行动态编译,注意不是解释)
4.JPython:运行在java平台上的解释器,把代码编译成java字节码执行
5.IronPython:.net
4.循环引用
是什么:
解决方法:
1.弱引用:weakref.ref
2.手动回收:gc.collect()
5.内存回收
1.引用计数
2.分代回收
3.标记-清除
6.进程、线程、协程
进程:系统进行资源分配和调度的基本单位
多进程的出现大大提高了用户体验
线程:CPU调度的最小单位
原因:多进程虽然提高了系统运行的效率,也有COW等技术对进程进行优化,但是进程的频繁创建和销毁代价较大、资源的大量复制和分配耗时仍然较高,于是80年代出现了能够独立运行的单位——线程。
多线程之间可以直接共享资源,同时线程之间的通信效率又远高于进程间,将任务并发的性能再次向前推进了一大步。
协程:一种用户态的轻量级线程,即协程是由用户程序自己控制调度的
原因:协程的概念最早提出于1963年,45但由于其并不符合当时崇尚的的“自顶向下”的程序设计思想,未能成为当时主流编程语言的一部分。
随着技术的发展,虽然进程和线程大大提高了cpu的使用率,但一些场景下线程CPU时间片的大量切换其实是做了很多不必要的无用功,特别是Python中因为GIL锁的存在,其多线程很多时候并不能提高程序运行效率,于是协程的概念又开始发挥了作用
7.LEGB
L:Local可能在一个函数或者类方法内部,局部命名空间
E:Enclosed可能在嵌套函数内,闭包作用域
G:Global全局命名空间
B:Built-in内建命名空间
DB相关
1.MySQL存储引擎
1.MyISAM:优势是访问速度快
2.InnoDB:5.5.5之后默认,支持事务和行级锁定,外键约束,缺点占用更多空间
3.Merge
4.Memory
储存过程:
Mysql储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之就是一组已经写好的命令,需要使用的时候拿出来用就可以了。
2.MySQL索引机制
由存储引擎决定,InnoDB用的是B+树
建立索引可以大大提高MySQL的检索速度,它就像字典的目录,通过目录可以快速找到要查找的内容
B+树与B树的区别:
1.B+树中只有叶子节点会带有指向记录的指针(ROWID),而B树则所有节点都带有
2.B+树中所有的叶子节点都是通过指针连接在一起,而B树不会
B+树的优点:
1.非叶子节点不会带上ROWID,这样一个块中可以容纳更多的索引项,一是可以降低树的高度;而是一个内部节点可以定位更多的叶子节点
2.叶子节点之间通过指针来连接,范围扫描将十分简单,而对于B树来说,则需要在叶子节点和内部节点间不停地往返移动。
B树的优点:
对于在内部节点的数据,可以直接得到,不必根据叶子节点来定位
Innodb引擎(聚集索引)
Myisam引擎(非聚集索引)
聚集索引跟非聚集索引的根本区别:
表记录的排列顺序与索引的排列顺序是否一致
MySQL的应用场景:数据结构相对统一,同时对于事务有较高要求
3.事务特性
ACID:原子性,一致性,隔离性,持久性
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中的所有更改都会被撤销。
4.事务隔离
事务的隔离性是数据库支持事务必备的四个特性之一,简单来说事务隔离就是并发执行的多个事务之间互不干扰。
事务隔离分为四个级别,第一个是RU未提交读,会出现脏读的问题,就是一个事物读取到另一个事物修改但未提交的数据;第二个是RC提交读,解决了脏读的问题,但是存在不可重复读的问题,就是一个事务对同一条数据两次读取结果不一致,这是因为两次读取过程中有其他事务队数据更改并提交;第三个是RR可重复读,解决了不可重复读的问题,但是存在幻读的问题,就是一个事务对同一范围两次读取结果不一致,这是因为两次读取过程中有其他事务对这个范围插入了新记录;第四个是SE可串行化,解决前面三种级别存在的问题,要求所有事务串行执行,读取的每行数据都会加锁,对性能和效率影响很大。
innoDB是mysql默认的存储引擎,默认的隔离级别是RR,并且在RR的隔离级别下更进一步,通过多版本并发控制(MVCC)解决不可重复读问题,加上间隙锁(也就是并发控制)解决幻读问题。因此innoDB的RR隔离级别其实实现了串行化级别的效果,而且保留了比较好的并发性能。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
MVCC:多版本并发控制机制
实现:通过保存数据在某个时间点的快照来实现的,同一个事务里能够看到数据一致的视图
间隙锁:间隙锁是一个在索引记录之间的间隙上的锁
5.Redis
使用场景:
1.缓存高频次访问的数据,降低数据库io
2.分布式架构,做session共享
3.利用zset类型可以储存排行榜
4.利用list做简易MQ或储存最新的n个数据
数据类型:
1.Hash
2.Str
3.List
4.Set
5.Zset
存储机制:
两种:Snapshot和AOF。无论是那种机制,Redis都是将数据存储在内存中。
性能 : Snapshot 性能较高
安全:AOF安全型较好
持久化方式:
RDB:RDB方式是一种快照式的持久化方法,将某一时刻的数据持久化到磁盘中
AOF:AOF方式是将执行过的写指令记录下来,在数据恢复时按照丛前到后的顺序再将指令执行一遍
6.MongoDB
存储引擎:
1.MMAP
2.WiredTiger:3.2版本默认存储引擎都改为了wiredtiger
3.RocksDB:和WiredTiger相比,写速度稳定
4.Memory
特性:
多文档事务支持
4.2版本开始支持分片集群分布式事务
第一范式:所有的列都是原子列——学生字段包括姓名,学号,此时不能将学生只作为一个字段
第二范式:所有的列都直接或间接依赖主键——学生表:学号(主键), 学生姓名(直接依赖);有字段老师名 间接依赖: 学院名称,学院地址(依赖于学院名称)
第三范式:所有的列都直接依赖主键
7.MongoDB和MySQL差异?
1.MySQL是关系型数据库的一种;MongoDB属于非关系型数据库
2.MySQL默认存储引擎是InnoDB,索引底层存储采用B+树;MongoDB默认存储引擎是WiredTiger,索引底层存储采用B树
3.MySQL支持事务,MongoDB18年6月4.0版本开始支持多文档事务,但是相对MySQL不够成熟
MySQL由数据库(database)、表(table)、记录(record)三个层次概念组成,
MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。
MongoDB的集合类似关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。
海量数据读写,频次高 -- MongoDB
关系型结构较多,应用场景事务要求高 -- MySQL
其他:成本、意愿、技术栈
web相关
1.TCP握手挥手及原理?
三次握手:
1.客户端向服务端发出连接请求报文,报文首部中的同部位SYN=1,同时选择一个初始化序号seq=x,此时客户端进入SYN-SENT(同步已发送)状态;
2.服务端收到请求报文后,发出确认报文,包含ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号seq=y,此时服务器进入SYN-RCVD(同步收到)状态;
3.客户端收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态,当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。
四次挥手:
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端。
(4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
为啥建立连接的时候是三次握手,而关闭连接的时候是四次挥手呢???
答:服务端在收到客户端请求连接连接(SYN)的时候,可以将SYN和ACK一起发送(放到一个报文中发送)。
服务端在收到客户端发来的FIN请求关闭连接的时候,仅表示客户端已没有数据发送了,但是服务端可能还有没发送完的数据,所以在回应ACK之后,还要等到将所有的数据发送完毕后,再向客户端回应一个FIN,确认可以关闭连接。
2.TCP连接状态
LISTEN:侦听来自远方的TCPport的连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED:代表一个打开的连接
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2:从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对连接中断的确认
LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:没有不论什么连接状态
3.一次完成的HTTP请求详细流程
1.域名解析(获取ip)
2.进行TCP连接(三次握手,连接成功进行下一步)
3.浏览器发送HTTP请求
4.服务器响应
5.断开TCP连接或者保存连接等待下次请求
6.浏览器对响应的数据进行渲染
解析顺序:
检查浏览器自身DNS缓存―> 操作系统DNS缓存 >hosts文件>DNS解析