赞
踩
超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。
现今广泛使用的一个版本为–HTTP 1.1
HTTP是一个客户端(用户)和服务端(网站)请求和应答的标准(TCP)。
无状态保存
HTTP是一种不保存状态的协议,即无状态协议。HTTP协议自身不对请求和响应之间的通讯状态进行保存。HTTP协议对发送的请求或响应都不做持久化处理。
无连接(短连接)
无连接的含义是每次连接值处理一个请求。服务器处理完客户的请求,并受到客户的应答后,即断开连接。
GET请求提交的数据会放在URL后面,也就是请求行里面,以?分割URL和传输诗句,参数之间以&相连,如:EditBook?name=test1&id=123456;POST方法是把提交的数据放到HTTP请求体中。
GET提交 的数据大小有限制(因为浏览器对URL的长度有限制),而POST提交的数据没有限制。
GET与POST请求在服务端获取数据方式不同,就是我们自己在服务端请求数据的时候的方式不同。
状态代码的第一个数字代表当前响应的类型:
1xx 消息 —— 请求已被服务器接收,继续处理
2xx 成功 —— 请求一成功被服务器接收、理解并接受
3xx 重定向 —— 需要后续操作才能完成这一请求
4xx 请求错误 —— 请求含有词法错误或者无法被执行
5xx 服务器错误 —— 服务器在处理某个正确请求时发生错误
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的基础上进一步标准化了SSL协议。在上面的图中可以看到,SSL和TSL位于传输层之上,在数据到达传输层之前都会经过SSL/TSL协议层处理,由SSL/TSL保证数据的机密性和完整性
TCP | UDP |
---|---|
面向连接 | 面向非连接 |
面向字节流 | 面向报文 |
可靠 | 不可靠 |
少量数据 | 传输大量数据 |
慢 | 快 |
文件传输 | 视频 |
拥塞机制,重传机制 | 无 |
三次握手
四次挥手
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的触发状态进行改变,从而实现线程间的通信和同步。
(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多路复用
假设你跟这个书店老板很熟了,我们问完有没有网络编程这本书之后,书店老板去找找,你说,找到之后放我家门口收件箱里吧,在这个收件箱里有我们所有请求的信息,只需要监听这个收件箱就可以了。
I/O多路复用是用于提升效率,单个进程可以同时监听多个网络连接IO。
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同一时间不停执行多个程序
迭代器 : 能被next调用,并不断返回下一个值的对象,叫做迭代器(对象)
概念:
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代
特征:
并不依赖索引,而通过next指针迭代所有数据,一次只取一个值,大大节省空间
使用iter创建一个迭代器对象,通过next调用
生成器:
生成器本质是迭代器,允许自定义逻辑的迭代器
迭代器和生成器区别:
迭代器本身是系统内置的.重写不了.而生成器是用户自定义的,可以重写迭代逻辑
生成器可以用两种方式创建:
(1)生成器表达式 (里面是推导式,外面用圆括号)
(2)生成器函数 (用def定义,里面含有yield)
可变参数的处理
args 打包成 tuple
kwargs 被打包成 dict
list = ['1','2','3','4','5']
print(list[10:])
'''
这是一个坑!很e心的操作,代码将输出[],它并不会产生我们脑海中预期的IndexError错误'''
(1)浅拷贝只拷贝一级容器中的所有数据
(2)深拷贝拷贝所有层级的所有元素
浅拷贝速度比深拷贝速度快
深拷贝在执行时: 如果是不可变数据,地址会暂时的指向原来数据,
如果是可变数据,直接开辟新空间
不可变数据: Number str tuple bool
可变数据 : list set dict
PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少。引用计数为0时,该对象生命就结束了
优点:【简单、实时性】
缺点:【维护引用计数消耗资源、循环引用】
1.在 Python 2 中,print 是一条语句,而 Python3 中作为函数存在。
2.Python2 的默认编码是 asscii,Python 3 默认采用了 UTF-8 作为默认编码
3.python3 彻底废弃了 long+int 双整数实现的方法, 统一为 int , 支持高精度整数运算.
4.xrange 函数被 Python3 废弃,统一使用 range,Python3 中 range 的机制也进行修改并提高
了大数据集生成效率
普通方法: 有参或者无参,如果是无参,只能类来调用
绑定方法: (1) 绑定到对象(自动传递对象参数) (2) 绑定到类(自动传递类参数)不实例化对象直接操作类时使用
静态方法: 无论是对象还是类,都可以调用此方法,而不会默认传递任何参数;如果一个函数,既和对象没有关系,也和类没关系就使用statimethod将这个函数变成静态方法
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能
同一时间,一个进程下的多个线程只能被一个cpu执行,不能实现线程的并行操作 python是解释型语言,执行一句编译一句,而不是一次性全部编译成功,不能提前规划,都是临时调度容易造成cpu执行调度异常.所以加了一把锁叫GIL
想要并行的解决办法:
(1)用多进程间接实现线程的并行
(2)换一个Pypy,Jpython解释器
函数名称或修饰词 | 说明 |
---|---|
filter() | 返回符合指定条件的QuerySet |
exclude() | 返回不符合指定条件的QuerySet |
ordey_by() | 串接到QuerySet之后,针对某一指定的字段进行排序 |
all() | 返回所有的QuerySet |
get() | 获取指定符合条件的唯一元素,如果找不到或有一个以上符合条件,都会产生exception |
first()/last() | 获取第1个和最后一个元素 |
count() | 可统计结果个数 |
exists() | 用来检查是否存在某指令条件的记录,通常附加在filter后面 |
reverse() | 用来对结果反转 |
distinct() | 用于去重 |
values( ) | 字典列表 |
gvalues_list( ) | 元组列表 |
1.应该尽量将API部署在专用域名之下。
2.应该将API的版本号放入URL。
3.所以网址中不能有动词,只能有名词
4.常用的HTTP动词有下面五个:
5.状态码(Status Codes)
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_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:
有三种格式,statement,row和mixed。
Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB,InnoDB索引是聚簇索引。
MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键。MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高。每张表被存放在三个文件:frm-表格定义、MYD(MYData)-数据文件、MYI(MYIndex)-索引文件,MyISAM索引是非聚簇索引。
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。
更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。
索引的优点
索引的缺点
where 子句
join列
order by
索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。
1.索引的原理很简单,就是把无序的数据变成有序的查询
2.把创建了索引的列的内容进行排序
3.对排序结果生成倒排表
4.在倒排表内容上拼上数据地址链
5.在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据
第一种方式:在执行CREATE TABLE时创建索引
第二种方式:使用ALTER TABLE命令去增加索引
Binary log:主数据库的二进制日志。
Relay log:从服务器的中继日志。
第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中。
第二步:salve开启一个I/O Thread,该线程在master打开一个普通连接,主要工作是binlog dump process。如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。I/O线程最终的目的是将这些事件写入到中继日志中。
第三步:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致。
字符串、列表、集合、散列表、有序集合。
优点
缺点
Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:
RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。
AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
当两种方式同时开启时,数据恢复Redis会优先选择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主从同步策略
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
全量同步
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
反向代理: 反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址
简单来说: 反向代理类似我们访问淘宝,由于访问量巨大,淘宝会使用许多台服务器(就是分布式服务器)来支持,但是每个客户端的请求到底由哪一台服务器来响应,我们并不知道。换句话说,客户端并不知道要把请求发送给具体哪一台服务器,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据。可以看到,客户端并不知道他访问的服务器是谁,这就是反向代理,隐藏了服务器的真实信息。
负载均衡是扩展应用程序并提高其性能和冗余的绝佳方法。Nginx是一种流行的Web服务器软件,可以配置为简单但功能强大的负载均衡器,以提高服务器资源的可用性和效率。在负载 均衡配置中,nginx充当在多个单独服务器上工作的分布式Web应用程序的单个入口点。
负载均衡方式:轮询,权重,Iphansh
配置关键字:upstream
最简明的算法,数据结构:https://blog.csdn.net/qq_45066628/article/details/111444435
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。