面试准备
系统复习:小专栏 编程帮 搜库云200技术博客 WX后端面试进阶指南 系统复习总览 搜云库技术 问题汇总 C语言知识网
Python:python 多线程学习 框架协议uWSGI uwsgi Python3学习 系统学习 python面试
MySQL:索引原理 索引 索引与优化实践 优化 MySQL MySQL 索引分类 隔离级别 性能优化
Redis:redis RDB与AOF 持久化RDB和AOF Redis考点 缓存穿透,缓存雪崩 缓存
设计风格:restful restful2 restful2
网络编程:http协议 web页面请求过程 三次握手 get 区别 cookie cookie2 跨域问题 公钥私钥 https加密原理
系统设计:分布式和集群区别
其他组件:docker 消息中间件 Elasticsearch nginx NGINX2 NGINX3
算法:leetcode100道
面试技巧
面试时准备白纸,给面试官画出流程图配合语言去解释,第二记下来问题,当做知识点记录下来。
数据库方面,别就知道增删改查,得了解性能优化
别单纯看单机版的框架,适当了解些分布式
Linux方面,至少了解如何看日志排查问题
通读一段底层代码,作为加分项
一切的一切,把上述技能嵌入到你做过的项目里
知识点归纳
线上代码调试:
pdb模块和pdb.set_trace()
a = 1
b = 2
import pdb
pdb.set_trace()
c = 3
print(a + b + c)
使用方法:
打完断点后,执行代码,执行到断点处,输入 p a 则输出 1 p b 输出 2
输入n 执行下一句
同源策略
所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
同源策略限制以下几种行为:
1.) Cookie、LocalStorage 和 IndexDB 无法读取
2.) DOM 和 Js对象无法获得
3.) AJAX 请求不能发送
Web 页面请求过程:
Web 网站通常使用 B/S 架构,浏览器(Browser)使用 HTTP 协议向服务器(Server)请求指定的 URL 资源。
在浏览器中输入一个 URL 并发送 HTTP 请求时,需要先使用 DNS 协议获取 URL 域名对应的 IP 地址,获取到 IP 地址之后就可以开始建立 HTTP 连接。
HTTP 连接是基于 TCP 连接之上的,HTTP 属于应用层,TCP 属于运输层。因此建立 HTTP 连接之前需要先建立 TCP 连接,那么就涉及到 TCP 的三次握手四次挥手等过程。
TCP 连接建立之后就可以开始建立 HTTP 连接,这个过程可能涉及到长短连接、HTTP 缓存、Cookie、HTTPs 等内容。
在海量用户的高并发请求下,网站架构需要满足低响应时间和高吞吐量等性能要求。除了性能要求之外,网站架构还需要满足伸缩性、扩展性、可用性、安全性等要求。为了满足这些要求,网站普遍使用缓存和集群等技术。
缓存是将图片、视频、js 等静态资源存储在用户比较容易获取到的位置,从而减轻服务器的压力并降低响应时间。
集群是将多台服务器组成一个整体,并使用负载均衡器将请求转发到集群中的某个服务器上,避免单一服务器的负载压力过大导致性能降低。
同步,异步,阻塞,非阻塞?
同步: 多个任务之间有先后顺序执行,一个执行完下个才能执行。
异步: 多个任务之间没有先后顺序,可以同时执行,有时候一个任务可能要在必要的时候获取另一个同时执行的任务的结果,这个就叫回调!
阻塞: 如果卡住了调用者,调用者不能继续往下执行,就是说调用者阻塞了。
非阻塞: 如果不会卡住,可以继续执行,就是说非阻塞的。
同步异步相对于多任务而言,阻塞非阻塞相对于代码执行而言。
是否是同步还是异步,关注的是任务完成时消息通知的方式。由调用方盲目主动问询的方式是同步调用,由被调用方主动通知调用方任务已完成的方式是异步调用。
是否是阻塞还是非阻塞,关注的是接口调用(发出请求)后等待数据返回时的状态。被挂起无法执行其他操作的则是阻塞型的,可以被立即「抽离」去完成其他「任务」的则是非阻塞型的。
三次握手:
1) 序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
2) 确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。
SYN:建立一个新连接。
FIN:断开一个连接。
Seq 是 Sequence 的缩写,表示序列;Ack(ACK) 是 Acknowledge 的缩写,表示确认;SYN 是 Synchronous 的缩写,愿意是“同步的”,这里表示建立同步连接;FIN 是 Finish 的缩写,表示完成。
三次握手的关键是要确认对方收到了自己的数据包,这个目标就是通过“确认号(Ack)”字段实现的。计算机会记录下自己发送的数据包序号 Seq,待收到对方的数据包后,检测“确认号(Ack)”字段,看Ack = Seq + 1是否成立,如果成立说明对方正确收到了自己的数据包。
四次挥手:
[Shake 1] 套接字A:“任务处理完毕,我希望断开连接。”
[Shake 2] 套接字B:“哦,是吗?请稍等,我准备一下。”
等待片刻后……
[Shake 3] 套接字B:“我准备好了,可以断开连接了。”
[Shake 4] 套接字A:“好的,谢谢合作。”
一句话知识
在使用InnoDB存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键。
因为:如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。这样就会形成一个紧凑的索引结构,近似顺序填满。由于每次插入时也不需要移动已有数据,因此效率很高,也不会增 加很多开销在维护索引上。
不自增可能会开辟一个新的页(节点),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置。将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构。
并行: 同一时刻多个任务同时在运行
不会在同一时刻同时运行,存在交替执行的情况。
实现并行的库有: multiprocessing
实现并发的库有: threading
为什么四次挥手:
- 确保最后一个确认报文能够达到。
- 等待一段时间是为了让本次连接持续时间内所产生的所有报文从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。
分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。
rest api本质是:通过URL定位资源,用get、post、put、delete等动词来操作资源
QPS:每秒查询数,每秒能够响应的查询次数
TPS:每秒处理的事务数。过程包括:客户端请求服务端、服务端内部处理。服务端返回客户端
RPS:吞吐率,即requests per Second的缩写。吞吐率是服务器并发处理能力的量化描述,单位是 reqs/s ,指的是某个并发用户数下单位时间内处理的请求数。RPS和QPS可以看作用一个统计方式。
聚簇索引:索引的叶节点指向数据
非聚簇索引:索引的叶节点指向数据的引用
mongodb优势:提升开发者效率,性能-索引,灵活-数据结构可随时变 可存二进制视频图片、而MySQL可能要改表结构,可拓展性-分片
适用于:无需复杂join查询,需求变动频繁、数据模型不定,并发大、数千QPS,海量数据存储,地理位置查询、文本查询
cookie:不可跨域性,Google不能访问修改baidu的。
数字签名:验证传输的内容是对方发送的数据,发送的数据没有被篡改过
疑难点
抢购问题:扩容-加机器,静态化-活动页面可以静态的元素全部静态化 减少动态元素,限流-IP限制 同一个IP单位时间内限制请求次数 或者活动入口加上答题或问题削峰,
秒杀的商品放入缓存中,加锁减库存
秒杀:比如卖500个商品,并发有1W,只放800个请求进来放入队列,后面的显示秒杀结束。