Python
GIL(Global Interpreter Lock)
全局解释器锁,CPython 实现时引入的概念,为了解决多线程数据完整性和同步问题。GIL 是一个防止解释器多线程并发执行机器码的一个全局互斥锁。其存在主要是因为在代码执行过程中,CPython 的内存管理不是线程安全的。
进程、线程、协程
- 进程:进程是资源分配的最小单位,每个进程拥有独立的代码区,堆,数据区。
- 线程:线程是 CPU 调度的最小单位,一个进程至少拥有一个线程,多个线程共享进程的资源。
- 协程:协程是基于事件循环的单独的子程序,协程可以被中断并在适当的时候重新执行。
MySQL
存储引擎
- innodb:支持事务,外键,行级锁,聚蔟索引和辅助索引。
- myisam:不支持事务,外键,支持表级锁,不支持聚蔟索引,主键索引和辅助索引结构一样。
查询计划
主要查看 key、extra 等信息,key 表示查询用到的索引,extra 包含多种信息。
- using index:查询使用了索引。
- using where:MySQL 将在存储引擎检索行后再进行过滤。
- using temporary:使用了 join 但是使用了其他表的字段作为查询条件。
- using filesort:排序没有走索引。
索引
ACID
- 原子性:一个事务要么全部提交成功,要么全部失败,不能只执行一部分操作。
- 一致性:事务前后数据的完整性必须保持一致。
- 隔离性:多个事务之间相互隔离。
- 持久性:事务一旦被提交,就会永久保存在磁盘中。
隔离级别
- 读未提交:可读取其它事务为提交的数据,会产生脏读
- 读已提交:可读取其它事务已提交的数据,会产生重复读取返回不同结果的情况
- 可重复读:多次重复读取会得到相同的结果,但是会产生幻读
- 串行化:对所有 select 强制加共享锁,使之不相互冲突,可能产生大量的超时现象和锁竞争
三大 log
binlog
记录 sql 语句,通过追加日志的形式写入,主要使用场景为主从复制与数据恢复。
有 STATMENT,ROW,MIXED 三种格式,STATMENT 记录修改数据的 SQL,减少日志量,某些情况会导致主从数据不一致;ROW 记录变动的数据,可能会产生大量的日志;MIXED 优先使用 STATMENT,STATMENT 不支持的使用 ROW。
redolog
记录事务对哪些数据进行了修改,实现一致性,先写 redolog buffer,再写磁盘文件。
undolog
记录数据的逻辑变化,比如 INSERT 的时候记录一条 DELETE,UPDATE 的时候记录一条相反的 undolog,在发生错误时通过 undolog 回滚到事务之前的状态。
TCP/IP 协议
TCP/UDP
TCP:可靠通信,需要提前建立连接,使用三次握手,四次挥手。 UDP:不可靠,面向无连接,性能更高,网络状况不好的时候会丢失。
三次握手
第一次:client 发送 SYN=1,seq=x,client 进入 SYN-SENT 状态。
第二次:server 发送 SYN=1,ACK=1,ack=x+1,seq=y,server 进入 SYN-RCVD 状态。
第三次:client 发送 ACK=1,seq=x+1,ack=y+1,client 进入 ESTABLISHED 状态,server 接收到消息后进入 ESTABLISHED 状态。
四次挥手
第一次:client 发送 FIN=1,seq=u,client 进入 FIN-WAIT-1 状态。
第二次:server 发送 ACK=1,ack=u+1,seq=v,server 进入 CLOSE-WAIT 状态。
第三次:client 接收到 server 确认结果后, 进入 FIN-WAIT-2,此时 server 发送 FIN=1,ACK=1,ack=u+1,seq=w,server 进入 LAST-ACK。
第四次:client 发送 ACK=1,ack=w+1,seq=u+1,client 进入 TIME-WAIT,经过 2MSL 后进入 CLOSED 状态,server 接收到后进入 CLOSED 状态。
HTTP 协议
GET/POST
GET:参数拼接在 url 之后,可被浏览器缓存,传输大小有限制,一般是由不同浏览器决定 POST:参数放在 body 中,可以以不同形式编码,如 x-www-form-urlencoded、json,传输数据理论上无限制,取决于服务端限制
SSO
统一认证中心,子系统跳转到认证中心拿 token,然后建立局部 session。
跨域
相应头部指定允许哪些 method,哪些 来源 host,哪些自定义 header 跨域。
Redis
数据结构
string,list,hash,set,sorted set,stream
底层实现
string
简单动态字符串(SDS),数据结构包含 len 记录当前字符串长度,free 记录 buf 数据中未使用的字节数量,buf 记录字符串。
list
使用链表实现,带有 len 属性。
hash
使用字典实现,多个哈希相同的键值对行程链表解决冲突问题。
sorted set
底层使用跳跃表实现,跳跃表是一个多层的链表,最底层包含所有元素,随机上浮每个元素形成链表,查找每个元素的时间复杂度为 O(logn)。