网络篇
一.介绍一下Http协议:
超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。
现今广泛使用的一个版本为–HTTP 1.1
HTTP是一个客户端(用户)和服务端(网站)请求和应答的标准(TCP)。
- 客户端向服务端发送一个请求报文,请求报文包含请求的方法、URL、协议版本、求情头部和
请求数据。 - 服务器已一个状态行作为响应,响应的内容包括协议的版本、成功或错误代码、服务器信息、
响应头部和响应数据。
HTTP 协议特点
-
无状态保存
HTTP是一种不保存状态的协议,即无状态协议。HTTP协议自身不对请求和响应之间的通讯状态进行保存。HTTP协议对发送的请求或响应都不做持久化处理。 -
无连接(短连接)
无连接的含义是每次连接值处理一个请求。服务器处理完客户的请求,并受到客户的应答后,即断开连接。
HTTP请求方式
- GET:向指定的资源发出"显示"请求。使用GET方法应该只用在读取数据,而不应当被用于产生"副
作用"的操作汇总,如Web Application。其中一个原因是GET可能被网络蜘蛛等随意访问。 - HEAD:于GET方法一样,都是向服务器发出制定个资源的请求。只不过服务器将不传回资源的本
文部分。他的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中"关于
该资源的信息"(元信息或元数据) - POST:向指定资源提交数据,请求服务器进行处理(如:提交表单或上传文件)。数据被包含在
请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。 - PUT:向指定资源位置上传其最新内容。
- DELETE:请求服务器删除Request-URI所有标识的资源。
GET与POST请求
GET请求提交的数据会放在URL后面,也就是请求行里面,以?分割URL和传输诗句,参数之间以&相连,如:EditBook?name=test1&id=123456;POST方法是把提交的数据放到HTTP请求体中。
GET提交 的数据大小有限制(因为浏览器对URL的长度有限制),而POST提交的数据没有限制。
GET与POST请求在服务端获取数据方式不同,就是我们自己在服务端请求数据的时候的方式不同。
HTTP状态码
状态代码的第一个数字代表当前响应的类型:
1xx 消息 —— 请求已被服务器接收,继续处理
2xx 成功 —— 请求一成功被服务器接收、理解并接受
3xx 重定向 —— 需要后续操作才能完成这一请求
4xx 请求错误 —— 请求含有词法错误或者无法被执行
5xx 服务器错误 —— 服务器在处理某个正确请求时发生错误
二.介绍一下Https通讯流程:

三.介绍一下Http和Https的区别:
-
HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
-
使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
-
HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
-
http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。
对称加密(扩展)
对称加密就是编码和解码使用同一个密钥的加密技术。

非对称加密(扩展)
非对称加密也成为公开密钥加密技术,就是使用不同密钥进行通信的加密技术。

非对称加密技术使用了不同的密钥进行通信,在发送端使用公钥对报文进行加密(公钥就是所用人都可以获取到的密钥),然后在接收端使用私钥对加密的密文进行解密。常见的非对称加密技术是RSA技术。
什么是SSL/TSL(扩展)
SSL和TSL是一种安全协议。其中SSL是早起采用的安全协议,后来TSL是在SSL的基础上进一步标准化了SSL协议。在上面的图中可以看到,SSL和TSL位于传输层之上,在数据到达传输层之前都会经过SSL/TSL协议层处理,由SSL/TSL保证数据的机密性和完整性
四.介绍一下tcp和udp的区别
| TCP | UDP |
|---|---|
| 面向连接 | 面向非连接 |
| 面向字节流 | 面向报文 |
| 可靠 | 不可靠 |
| 少量数据 | 传输大量数据 |
| 慢 | 快 |
| 文件传输 | 视频 |
| 拥塞机制,重传机制 | 无 |
五.三次握手,四次挥手
三次握手

四次挥手

六.介绍一下websocket协议
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

操作系统
介绍一下进程,线程,协程
1.进程:
进程就是正在运行的程序。通俗讲就是一段代码在没运行之前称为程序,运行之后就会变成一个进程。进程是操作系统中资源分配最小的单位。分配的资源是cpu和物理内存。进程之间通信彼此隔离。
2.线程
线程是操作系统中调度最小的二进制单位。线程依赖于进程,一个进程有一个线程。
3.协程
协程是一种基于用户态的轻量级的线程。协程是为了实现单线程的并发,协程是由程序进行控制的,协程拥有自己的寄存器上下文和栈。
进程之间的通信方式
1.管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
2.命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
3.消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4.共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
5.信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
6.套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
7.信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
线程间通信方式
线程之间通信的两个基本问题是互斥和同步。
(1)全局变量
进程中的线程间内存共享,这是比较常用的通信方式和交互方式。定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化。
(2)Message消息机制
常用的Message通信的接口主要有两个:PostMessage和PostThreadMessage,
PostMessage为线程向主窗口发送消息。而PostThreadMessage是任意两个线程之间的通信接口。
(3)事件对象
CEvent为MFC中的一个对象,可以通过对CEvent的触发状态进行改变,从而实现线程间的通信和同步。
fork()与vfock()区别
(1) fork ( )子进程复制父进程数据段和代码段 ;vfork( )子进程与父进程共享数据段 。
(2)fork ( )父、子进程的执行次序不确定;vfork保证子进程先运行,在调用exit ()之前 与父进程共享数据(在父进程空间中执行)。
(3)vfork( )保证子进程先运行,子进程exit ( )前父进程不会被调度。如果在调用exit ()之前子进程依赖于父进程的进一步动作,则会导致死锁。
死锁
死锁是由于多个进程(或线程)在执行过程争夺资源,造成相互等待的僵局现象,若无外力作用,这些进程(线程)将无法向前推进。
死的四个必要条件:(发生死锁,以下条件必然成立;四个条件都满足,发生死锁)
(1)互斥条件
某个资源同一时刻只能被一个进程访问,其他进程访问时要等待。
(2)不可剥夺条件
进程未使用完所获得资源,不能被其他进程剥夺,只能自己主动释放。
(3)请求和保持条件
介绍一下僵尸进程和孤儿进程
1.僵尸进程
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程
2.孤儿进程
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作
介绍一下IO多路复用的作用
阻塞IO
举个简单的例子,我们要买网络编程一本书,来到书店问老板,老板的回复是等待一下,他去找书,这个时候我们就只能静静的等,直到老板找到这本书。
非阻塞IO
还是上面的例子,我们要买网络编程这本书,来到书店问老板,老板的回复是他去找书,这个时候情况就不同了,我们出去买一根雪糕,回来之后再问老板找到了没有 ,如果老板回复没有找到,我们再出去买包辣条再回来,直到老板回复找到了。
阻塞IO存在的问题是,当数据没有到来时,程序会一直阻塞,什么事情也做不了。非阻塞IO虽然会及时返回一个结果,但是需要不停地轮询IO请求的状态。
IO多路复用
假设你跟这个书店老板很熟了,我们问完有没有网络编程这本书之后,书店老板去找找,你说,找到之后放我家门口收件箱里吧,在这个收件箱里有我们所有请求的信息,只需要监听这个收件箱就可以了。
I/O多路复用是用于提升效率,单个进程可以同时监听多个网络连接IO。
说一下select、poll、epoll 模型的区别
select
优点:单进程下支持高并发,可以跨平台
缺点:
多次从内核到应用,应用到内核的数组拷贝;
每次内核都会重置填写的数据
最大支持1024客户端,原因在于fd_set定义使用了FD_SETSIZE,大小为1024;
POLL模型:
POLL的原理与select相同,比select改进的地方:
1,请求和返回分离,避免每次都要重设数组
2,可以突破1024限制,poll是由打开文件的上限决定,可以使用ulimit命令查看上限
3,不能跨平台
EPOLL:
不管是select,还是poll,都需要遍历数组轮询,而且select仅支持1024个客户端,在大量并发,少量活跃的情况下效率较低,也就滋生了epoll模型。
1,可以突破1024限制,不跨平台
2,无须遍历整个文件描述符集,只需遍历被内核IO事件异步唤醒,而加入ready队列的文件描述符。
3,除了select/poll的IO事件水平触发(level triggered)外,还提供边沿触发(edge Triggered),可以缓存IO状态,减少epoll_wait调用,提高效率

进程锁和线程锁的作用
线程锁:
多线程可以同时运行多个任务但是当多个线程同时访问共享数据时,可能导致数据不同步,甚至错误! so,不使用线程锁, 可能导致错误
进程锁:
也是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的,但是可以使用本地系统的信号量控制(操作系统基本知识)。
什么是并发和并行?
并发:一个cpu同一时间不停执行多个程序
并行:多个cpu同一时间不停执行多个程序
描述一下进程三状态

python
介绍一下生成器和迭代器
迭代器 : 能被next调用,并不断返回下一个值的对象,叫做迭代器(对象)
概念:
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代
特征:
并不依赖索引,而通过next指针迭代所有数据,一次只取一个值,大大节省空间
使用iter创建一个迭代器对象,通过next调用
生成器:
生成器本质是迭代器,允许自定义逻辑的迭代器
迭代器和生成器区别:
迭代器本身是系统内置的.重写不了.而生成器是用户自定义的,可以重写迭代逻辑
生成器可以用两种方式创建:
(1)生成器表达式 (里面是推导式,外面用圆括号)
(2)生成器函数 (用def定义,里面含有yield)
Python中【args】【kwargs】 是什么
可变参数的处理
args 打包成 tuple
kwargs 被打包成 dict
下面代码会输出什么?
list = ['1','2','3','4','5']
print(list[10:])
'''
这是一个坑!很e心的操作,代码将输出[],它并不会产生我们脑海中预期的IndexError错误'''
Python中的深拷贝和浅拷贝有什么区别?
(1)浅拷贝只拷贝一级容器中的所有数据
(2)深拷贝拷贝所有层级的所有元素
浅拷贝速度比深拷贝速度快
深拷贝在执行时: 如果是不可变数据,地址会暂时的指向原来数据,
如果是可变数据,直接开辟新空间
python数据类型有哪些
不可变数据: Number str tuple bool
可变数据 : list set dict
Python垃圾回收机制
PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少。引用计数为0时,该对象生命就结束了
优点:【简单、实时性】
缺点:【维护引用计数消耗资源、循环引用】
Python2/3的差异点
1.在 Python 2 中,print 是一条语句,而 Python3 中作为函数存在。
2.Python2 的默认编码是 asscii,Python 3 默认采用了 UTF-8 作为默认编码
3.python3 彻底废弃了 long+int 双整数实现的方法, 统一为 int , 支持高精度整数运算.
4.xrange 函数被 Python3 废弃,统一使用 range,Python3 中 range 的机制也进行修改并提高
了大数据集生成效率
Python中静态方法、类方法、成员函数作用是什么
普通方法: 有参或者无参,如果是无参,只能类来调用
绑定方法: (1) 绑定到对象(自动传递对象参数) (2) 绑定到类(自动传递类参数)不实例化对象直接操作类时使用
静态方法: 无论是对象还是类,都可以调用此方法,而不会默认传递任何参数;如果一个函数,既和对象没有关系,也和类没关系就使用statimethod将这个函数变成静态方法
函数装饰器有什么作用
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能
GIL锁
同一时间,一个进程下的多个线程只能被一个cpu执行,不能实现线程的并行操作 python是解释型语言,执行一句编译一句,而不是一次性全部编译成功,不能提前规划,都是临时调度容易造成cpu执行调度异常.所以加了一把锁叫GIL
想要并行的解决办法:
(1)用多进程间接实现线程的并行
(2)换一个Pypy,Jpython解释器
Django
django请求生命周期

django orm十三条方法
| 函数名称或修饰词 | 说明 |
|---|---|
| filter() | 返回符合指定条件的QuerySet |
| exclude() | 返回不符合指定条件的QuerySet |
| ordey_by() | 串接到QuerySet之后,针对某一指定的字段进行排序 |
| all() | 返回所有的QuerySet |
| get() | 获取指定符合条件的唯一元素,如果找不到或有一个以上符合条件,都会产生exception |
| first()/last() | 获取第1个和最后一个元素 |
| count() | 可统计结果个数 |
| exists() | 用来检查是否存在某指令条件的记录,通常附加在filter后面 |
| reverse() | 用来对结果反转 |
| distinct() | 用于去重 |
| values( ) | 字典列表 |
| gvalues_list( ) | 元组列表 |
Restful规范
1.应该尽量将API部署在专用域名之下。
2.应该将API的版本号放入URL。
3.所以网址中不能有动词,只能有名词
4.常用的HTTP动词有下面五个:
- GET(SELECT):从服务器取出资源(一项或多项)。
- POST(CREATE):在服务器新建一个资源。
- PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
- PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
- DELETE(DELETE):从服务器删除资源。
5.状态码(Status Codes)
- 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
- 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
- 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
- 204 NO CONTENT - [DELETE]:用户删除数据成功。
- 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
- 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
- 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
- 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
- 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
- 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
- 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
- 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
django rest framework框架中都有那些组件
1.序列化组件:serializers 对queryset序列化以及对请求数据格式校验
2.路由组件routers 进行路由分发
3.视图组件ModelViewSet 帮助开发者提供了一些类,并在类中提供了多个方法
4.认证组件 写一个类并注册到认证类(authentication_classes),在类的的authticate方法中编写认证逻
5.权限组件 写一个类并注册到权限类(permission_classes),在类的的has_permission方法中编写认证逻辑
6.频率限制 写一个类并注册到频率类(throttle_classes),在类的的allow_request/wait 方法中编写认证逻辑
7.解析器 选择对数据解析的类,在解析器类中注册(parser_classes)
8.渲染器 定义数据如何渲染到到页面上,在渲染器类中注册(renderer_classes)
9.分页 对获取到的数据进行分页处理, pagination_class
Mysql
mysql有关权限的表都有哪几个
MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:
- user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
- db权限表:记录各个帐号在各个数据库上的操作权限。
- table_priv权限表:记录数据表级的操作权限。
- columns_priv权限表:记录数据列级的操作权限。
- host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。
MySQL的binlog有有几种录入格式?分别有什么区别
有三种格式,statement,row和mixed。
- statement模式下,每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。
- row级别下,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大。
- mixed,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。
MySQL存储引擎MyISAM与InnoDB区别
-
Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB,InnoDB索引是聚簇索引。
-
MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键。MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高。每张表被存放在三个文件:frm-表格定义、MYD(MYData)-数据文件、MYI(MYIndex)-索引文件,MyISAM索引是非聚簇索引。
什么是索引
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。
更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。
索引有哪些优缺点
索引的优点
- 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
- 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点
- 时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;
- 空间方面:索引需要占物理空间。
索引使用场景
where 子句
join列
order by
索引有哪几种类型
- 主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
- 唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
- 普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
- 联合索引:两个或更多个列上的索引被称作联合索引,联合索引又叫复合索引。
索引的基本原理
索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。
1.索引的原理很简单,就是把无序的数据变成有序的查询
2.把创建了索引的列的内容进行排序
3.对排序结果生成倒排表
4.在倒排表内容上拼上数据地址链
5.在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据
创建索引的原则
- 较频繁作为查询条件的字段才去创建索引
- 更新频繁字段不适合创建索引
- 尽量的扩展索引,不要新建索引
- 不要过度索引
- 对于那些查询中很少涉及的列,重复值比较多的列不要建立索引
创建索引的方式
第一种方式:在执行CREATE TABLE时创建索引
第二种方式:使用ALTER TABLE命令去增加索引
什么是最左前缀原则?什么是最左匹配原则
- 顾名思义,就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。
- 最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
- =和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
B树和B+树和Hash索引的区别
- 在B树中,你可以将键和值存放在内部节点和叶子节点;
- 但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值。B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。B+树底层实现是多路平衡查找树。
- hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据。
MySQL主从复制原理

Binary log:主数据库的二进制日志。
Relay log:从服务器的中继日志。
第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中。
第二步:salve开启一个I/O Thread,该线程在master打开一个普通连接,主要工作是binlog dump process。如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。I/O线程最终的目的是将这些事件写入到中继日志中。
第三步:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致。
MySQL事务的四大特性及其实现方式
- 原子性(Atomicity):语句要么全执行,要么全不执行,是事务最核心的特性,事务本身就是以原子性来定义的。实现主要基于undo log日志。
- 持久性(Durability):保证事务提交后不会因为宕机等原因导致数据丢失。实现主要基于redo log日志。
- 隔离性(Isolation):保证事务执行尽可能不受其他事务影响。InnoDB默认的隔离级别是RR,RR的实现主要基于锁机制、数据的隐藏列、undo log和类next-key lock机制。
- 一致性(Consistency):事务追求的最终目标,一致性的实现既需要数据库层面的保障,也需要应用层面的保障。
redis
redis数据类型
字符串、列表、集合、散列表、有序集合。
Redis有哪些优缺点
优点
- 读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
- 支持数据持久化,支持AOF和RDB两种持久化方式。
- 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
- 数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
- 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
缺点
- 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
- Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
- 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
- Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
什么是Redis持久化
Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:
RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。
AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
AoF重写机制

-
执行 aof 重写请求
-
如果当前进程正在执行 aof 重写,请求不执行并返回如下响应
ERR Background append only file rewriting already in process -
如果当前正在执行 bgsave ,重写命令等待 bgsave 完成后执行 ,返回如下响应
Background append only file rewriting shceduled -
父进程执行 fork 创建子进程,开心等同于bgsave过程
-
父进程 fork 操作完毕之后,依然响应其他命令,所有修改命令依然写入 aof 缓冲区,并根据 appendfsync策略同步到硬盘,保证原有 aof 机制的有效性。
-
由于 fork 操作采用写时复制技术,子进程只能共享fork 操作时的内存数据,由于父进程依然响应命令,redis 使用 aof 重写缓冲区 保存这部分新数据,防止aof文件生成期间这部分数据的丢失。
-
子进程根据内存快照,按照命令合并规则写入到新的 aof 文件
-
新 aof 文件 写入完成之后,子进程通知 父进程,父进程更新统计信息
-
父进程把 aof 重写缓冲区的数据写入 新的 aof 文件
-
使用 新 aof 文件替换 旧的 aof 文件
介绍一下redis主从同步
为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。
Redis主从同步策略
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
全量同步
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
- 从服务器连接主服务器,发送SYNC命令;
- 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
- 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
- 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
- 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
- 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

增量同步
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
Nginx
简述一下反向代理和负载均衡
反向代理: 反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址
简单来说: 反向代理类似我们访问淘宝,由于访问量巨大,淘宝会使用许多台服务器(就是分布式服务器)来支持,但是每个客户端的请求到底由哪一台服务器来响应,我们并不知道。换句话说,客户端并不知道要把请求发送给具体哪一台服务器,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据。可以看到,客户端并不知道他访问的服务器是谁,这就是反向代理,隐藏了服务器的真实信息。
负载均衡是扩展应用程序并提高其性能和冗余的绝佳方法。Nginx是一种流行的Web服务器软件,可以配置为简单但功能强大的负载均衡器,以提高服务器资源的可用性和效率。在负载 均衡配置中,nginx充当在多个单独服务器上工作的分布式Web应用程序的单个入口点。
负载均衡方式:轮询,权重,Iphansh
配置关键字:upstream
算法:
最简明的算法,数据结构:https://blog.csdn.net/qq_45066628/article/details/111444435
761

被折叠的 条评论
为什么被折叠?



