粘包问题
粘包问题是在TCP协议下,发送方发送的多个数据包在接收方接收时,数据之间没有明确的分界线,导致接收方无法正确区分每个数据包,从而无法正确读取数据。
解决办法:
1、服务器和客户端提前协商好每个消息的长度,不足的部分用空白字符补足。
2、特殊结束符:双方协商定义一个特殊的分隔符,只要没有收到分隔符就意味着一条数据没有结束。
3、由服务器开发者提供固定格式的协议标准,双方都按照协议进行发送和接收数据。
正向代理和反向代理
正向代理,主要是代理客户端,隐藏客户端的信息。当一个客户端想要访问某个服务器时,它会先将请求发送到正向代理服务器,由正向代理服务器去请求目标服务器。在这个过程中,目标服务器并不知道真正的客户端是谁,它只知道请求来自正向代理服务器。通过它可以实现访问限制、提高访问速度以及隐藏客户端IP等功能。
反向代理则是代理服务器端,隐藏服务器的信息。当客户端发送请求时,它会直接发送到反向代理服务器,然后由反向代理服务器去请求真正的服务器。在这个过程中,客户端并不知道真正的服务器是谁,可以通过它可以实现负载均衡、提高访问速度、防止恶意攻击等功能。
OSI七层协议
OSI模型是一个开放性的通信系统互连参考模型,它定义了网络通信的七层结构
1、应用层:这是网络服务与最终用户的一个接口。应用层负责处理用户输入的命令和数据,并将其转换为网络协议可以识别的格式。
2、表示层:表示层主要负责数据的表示、安全、压缩等。它会在发送方将数据转换为适合网络传输的格式,并在接收方将数据还原为原始格式。
3、会话层:会话层负责建立、管理、终止会话,会话层给表示层提供服务
4、传输层:传输层负责定义传输数据的协议端口号,以及流控和差错校验。常见的传输层协议有TCP和UDP。
5、网络层:网络层负责提供连通性和路径的选择。它会在发送方将数据分组,并选择最佳路径将数据包发送到接收方。常见的网络层协议有IP、ICMP、IGMP等。
6、数据链路层:数据链路层负责在物理链路上可靠地传输数据。它会在发送方将数据封装成帧,并在接收方进行差错校验和流量控制。
7、物理层:物理层是OSI模型的最底层,负责建立、维护、断开物理连接。
数据库优化
原因:1、系统的吞吐量瓶颈往往出现在数据库的访问速度上随着应⽤程序的运⾏
2、数据库的中的数据会越来越多,处理时间会相应变慢
3、数据是存放在磁盘上的,读写速度⽆法和内存相⽐,
措施:
1、将字段很多的表分解成多个表,对于字段较多的表,如果有些字段的使⽤频率很低,可以将这些字段分离出来形成新表
2、需要经常联合查询的表,可以建⽴中间表以提⾼查询效率。
3、设计数据表时应尽量遵循范式理论的规约,尽可能的减少冗余字段,让数据库设计看起来精致、优雅。但是,合理的加⼊冗余字段可以提⾼查询速度
如何提高项目的并发量
可以从前端、后端、数据库、网络架构等多个方面进行优化
前端优化:
1、使用CDN(内容分发网络)来分发JS、CSS、图片等,减少用户访问时的延迟 2、对图片进行优化,比如将多个小图片合并成一个大图,减少图片请求的次数。
3、使用前端缓存。
后端优化:1、避免锁表操作,减少数据库访问的冲突
2、使用缓存技术
3、优化数据库查询语句,提高查询效率。
网络架构优化:1、使用高性能的Web服务器,提高处理请求的能力。
2、使用消息队列技术,将请求异步处理,提高系统的响应速度。
3、采用读写分离技术
4、使用分布式数据库技术,将数据分散到多个数据库服务器上存储和查询,提高数据的并发访问能力。
除了以上方法外,还可以考虑从代码层面进行优化,如使用异步编程技术、减少IO操作等
排查用django查询数据库速度缓慢
1.先从程序排查: 保证数据库的操作语句不在循环体下面,核心就是减少和数据库的io操作
2.从数据库出发: 在程序不存在第一种情时,在orm查询数据库的时候,对查询条件字段在数据库种添加索引,提高该字段的查询效率
3.从数据库到程序,添加redis缓存库,原理即程序查询数据库会先进去redis缓存,如果缓存中存在,则直接返回数据,如果缓存中没有,才会进去mysql查询数据并加入缓存再返回结果给程序
并发与并行、同步与异步、阻塞和非阻塞
并行:计算指的是在同一时刻,多个任务在多核处理器上同时进行。
并发:是一段时间内看起来是是同时运行。在单线程模型中,每个任务执行一小段时间后,会切换到下一个任务,由于切换速度非常快,给用户的感觉是这些任务在同时运行。但实际上,在某一具体时刻,只有一个任务在执行。
同步是指一个任务发出请求后,必须等待系统响应后才能继续执行后续的任务。在等待期间,任务会阻塞,不会执行其他任何工作。
异步操作是指一个任务发出请求后,不必等待系统响应就可以继续执行后续的任务。系统处理完请求后,会通过某种方式通知任务。
阻塞是指当一个线程或进程等待某个操作完成时,它不能做其他任何事情。
非阻塞指线程或进程在执行某项操作时,不会挂起或等待,这样线程或进程可以继续执行其他任务,而不是被阻塞在原地。
异步+非阻塞是效率最高的
为什么计算密集型用多进程,计算io密集型用多线程
计算密集型任务主要涉及到大量的计算工作,如数学运算、逻辑判断等,这类任务通常不会涉及大量的IO操作
多进程的原因是:
1、使用多进程可以充分利用多核CPU的并行处理能力,从而提高任务的整体执行效率
2、因为GIL会阻止同一时刻多个线程执行Python代码,而进程避免GIL锁限制
3、每个进程有其独立的内存空间和资源,这使得资源管理和错误隔离更加容易。
IO密集型任务主要涉及到大量的输入/输出操作,如文件读写、网络通信等。在这种情况下,多线程通常是更好的选择:
1、避免线程切换开销
2、多线程共享同一个进程的内存空间,这意味着它们可以更容易地共享数据和状态信息,从而减少资源消耗
3、多线程可以配合IO多路复用技术同时处理多个IO操作,从而提高整体的IO处理效率
GIL
GIL又称全局解释器锁,简单来说是一个互斥锁,每个线程在执行的过程中都需要先获取GIL作用就是限制多线程同时执行,使得在同一进程内任何时刻仅有一个线程在执行。线程是非独立的,所以同一进程里线程是数据共享,当各个线程访问数据资源时会出现“竞争”状态,即数据可能会同时被多个线程占用,造成数据混乱,这就是线程的不安全。所以引进了互斥锁,确保某段关键代码、共享数据只能由一个线程从头到尾完整地执行。
ORM
ORM也称是对象关系映射,其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来,用ORM的好处就是你不用操作表,可以在程序中用面向对象的思路,直接操作对象即可
INSERT INTO user1(name) VALUES("the5fire");