一、计算机网络

TCP/UDP
  • TCP/IP即传输控制协议,是面向连接的协议,发送数据前要先建立连接,TCP提供可靠的服务,也就是说,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达。(类似于打电话)

  • UDP它是属于TCP/IP协议族中的一种。是无连接的协议,发送数据前不需要建立连接,是没有可靠性的协议。因为不需要建立连接所以可以在在网络上以任何可能的路径传输,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。(类似于发微信)

TCP三次握手四次挥手

三次握手:

  1. 第一次握手:客户端向服务器发送请求,请求建立数据连接。

  1. 第二次握手:服务器收到请求后,向客户端发送确认信息,表示服务器已经收到请求并同意建立数据连接。

  1. 第三次握手:客户端收到确认信息后,再向服务器发送确认信息,表示客户端已经收到确认信息,数据连接建立成功。

四次挥手:

  1. 第一次挥手:客户端向服务器发送请求,请求断开数据连接。

  1. 第二次挥手:服务器收到请求后,向客户端发送确认信息,表示服务器已经收到请求并同意断开数据连接。

  1. 第三次挥手:客户端收到确认信息后,再向服务器发送确认信息,表示客户端已经收到确认信息,数据连接断开成功。

  1. 第四次挥手:服务器收到确认信息后,再向客户端发送确认信息,表示服务器已经收到确认信息,数据连接断开成功。

七层网络
  1. 物理层:主要负责传输数据的物理基础,如电缆、无线等。

  1. 数据链路层:负责在物理层的传输的基础上,建立通信链接,保证数据的正确传输(以太网、蓝牙、WIFI)。

  1. 网络层:负责实现数据的路由和传输,从而实现网络的连通性(IP、ICMP、ARP、RIP、OSPF 等)。

  1. 传输层:负责确保数据的可靠传输,如重传、检测丢包等(TCP、UDP 等)。

  1. 会话层:负责管理会话的建立、维护和终止。

  1. 表示层:负责处理数据的格式,以及对数据进行编码和解码。

  1. 应用层:负责实现应用程序的通信(HTTP、FTP、SMTP、DNS)。

HTTP:请求-响应通信协议

请求报文格式:请求行(url、端口、请求方式、HTTP版本)、请求头(编码、服务器地址)、请求体

响应报文格式:状态行、响应头部、响应体

HTTPS:非对称加密的采用SSL/TLS 协议的请求响应协议

WebSocket:双向通信协议,例如动态数据,如实时状态、聊天消息

IPV4/IPV6:32位/64位,并在数据包格式、协议特性、安全性方面做了改进

输入URL到渲染页面的过程:

  • DNS域名解析ip地址、建立TCP连接、请求和响应、解析HTML及其他资源、渲染页面

状态码
滑动窗口协议

滑动窗口协议是一种用于在不可靠的网络上传输数据的协议。发送方将数据分成多个部分,并分配序号,接收方按照序号接收数据,并发送确认信息给发送方,以确保数据的正确传输。发送方会根据接收到的确认信息进行调整,以提高传输效率。滑动窗口协议的窗口大小是一个关键参数,它限制了发送方和接收方未确认数据的数量。

对称加密和非对称加密SSL/TLS协议

HTTPS使用了非对称加密算法和对称加密算法相结合的方式来实现数据加密。其中,非对称加密算法用于在客户端和服务器之间进行密钥交换,而对称加密算法则用于在数据传输过程中对数据进行加密和解密。

对称加密算法使用相同的密钥对数据进行加密和解密,因此密钥需要在客户端和服务器之间共享。这种方式的优点是加密和解密速度快,但缺点是密钥容易被窃取,从而导致数据泄露。

非对称加密算法则使用一对密钥,分别为公钥和私钥。公钥可以公开,任何人都可以使用它对数据进行加密,但只有持有私钥的人才能解密数据。这种方式的优点是密钥不需要共享,因此更安全,但缺点是加密和解密速度较慢。

在HTTPS中,非对称加密算法用于在客户端和服务器之间进行密钥交换,以确保传输的密钥不被窃取。然后,使用对称加密算法对数据进行加密和解密,以保证数据传输的安全性和效率。

HTTP截获报文
  1. 代理服务器(Proxy Server)截获:代理服务器是客户端和目标服务器之间的中介,它可以截获客户端发送的HTTP请求和目标服务器返回的HTTP响应。代理服务器可以在不改变请求的情况下,记录请求和响应的内容。

  1. 网络分析工具(Network Sniffer)截获:网络分析工具可以在网络上截获所有通过该工具所在的网络接口的数据包,包括HTTP请求和响应。网络分析工具可以根据协议类型过滤HTTP请求和响应,以便分析和记录。

  1. 浏览器插件(Browser Extension)截获:浏览器插件可以截获浏览器发送的HTTP请求和接收的HTTP响应。例如,Chrome浏览器的开发者工具可以截获浏览器发送的HTTP请求和接收的HTTP响应,并提供详细的请求和响应报文的分析和调试功能。

HTTP的Header
  1. Accept:指定客户端可接受的MIME类型

  1. Accept-Encoding:指定客户端可接受的编码类型

  1. Authorization:包含用于身份验证的凭证,通常是用户名和密码的Base64编码

  1. Cache-Control:指定缓存机制

  1. Content-Length:指定请求或响应正文的长度

  1. Content-Type:指定请求或响应正文的MIME类型

  1. Cookie:包含客户端的Cookie信息

  1. Host:指定请求的主机名和端口号

  1. If-Modified-Since:指定上次修改时间,用于条件GET请求

  1. User-Agent:包含客户端的用户代理信息

报文

二、数据结构

栈与堆的区别

栈和堆都是计算机内存中的存储区域,但它们有以下不同之处:

  1. 存储方式:栈是一种后进先出(LIFO)的数据结构,它的存储方式类似于一摞盘子,新的数据存放在最顶部,取数据时也从顶部取出;堆则是一种动态分配内存的机制,它的存储方式是将数据存储在不连续的内存空间中。

  1. 内存分配方式:栈的内存分配方式是由编译器自动管理的,它会在程序运行时自动分配和释放内存空间,不需要手动控制;堆的内存分配则需要由程序员手动申请和释放内存空间,否则可能会出现内存泄漏等问题。

  1. 访问速度:由于栈的内存结构是连续的,所以访问速度较快;而堆的内存结构是不连续的,访问速度较慢。

  1. 分配大小:栈的内存大小固定,通常比较小,一般在几 MB 左右;堆的内存大小不固定,可以根据需要动态分配,可以分配更大的内存空间。

  1. 生命周期:栈上的变量的生命周期与其所在函数的生命周期相同,函数执行结束后,它们就会被自动释放;堆上的变量则可以在程序的任意位置被使用和访问,并且只有在程序显式地释放它们时才会被释放。

  1. 适用场景:栈通常用于存储程序执行期间的临时数据,比如函数的局部变量、函数参数、函数调用的返回地址等。由于栈的存储方式是后进先出(LIFO),所以它非常适合用于函数调用和返回等场景,能够高效地管理函数的局部变量和临时数据。堆则通常用于存储动态分配的数据,比如数组、对象、指针等。由于堆的内存大小不固定,程序可以根据需要动态分配和释放内存空间,所以它非常适合用于动态数据结构和数据存储等场景。但是,由于堆的内存分配需要由程序员手动管理,所以在使用堆时需要注意内存泄漏等问题。

三、操作系统

地址空间
  1. 代码段:存储程序的代码,一般只读。

  1. 数据段:存储程序的数据,可读写。

  1. 栈:存储程序的函数调用栈,存储函数调用过程中的局部变量等数据。

  1. 堆:动态内存分配区域,用于动态分配内存。

进程和线程

线程状态:就绪、运行、阻塞、等待、终止

悲观锁、乐观锁

乐观锁:是一种不加锁的并发控制策略,在更新数据时,先判断数据是否被修改,如果没有被修改,则更新,否则不更新。乐观锁的思想是相信数据一般不会被其他事务修改,所以不加锁,从而提高效率。

悲观锁:是一种加锁的并发控制策略,在读取数据前,先加锁,在更新数据时也需要加锁,更新完数据后再释放锁。悲观锁的思想是相信数据一定会被其他事务修改,所以对数据加锁,从而保证数据的完整性。

调度算法:先来先服务、最短作业优先、最短剩余时间优先、轮询算法(RR)

页面置换算法:LRU、FIFO、NRU

如何预防死锁

死锁:A占有资源1,同时申请资源2;而B占有资源2,同时申请资源1;

1、互斥条件

2、请求和保持条件:阻塞时释放已经获得的资源

3、不剥夺条件:不能获得全部资源则等待

4、环路等待条件:资源编号,进程获得编号小的资源才能获取到大的

线程安全

线程安全指的是多线程环境下,对共享资源的访问是安全的,不会出现数据不一致、数据丢失等问题。在多线程环境中,由于多个线程共同操作一个资源,可能会出现多个线程同时对一个资源进行读写的情况,这就会导致线程安全问题。常见的线程安全问题包括数据竞争、死锁、饥饿等。

为了确保线程安全,开发人员通常采用以下几种方式:

  1. 加锁:使用同步机制来控制对共享资源的访问,保证同一时间只有一个线程可以访问共享资源。

  1. 原子操作:原子操作指的是不能被中断的操作,保证其执行的完整性。

  1. 使用线程安全的数据结构:使用线程安全的集合类,例如Vector、ConcurrentHashMap等。

  1. 避免共享资源:尽量避免多个线程共同操作同一个资源,避免线程安全问题的出现。

四、数据库

ACID

原子性(Atomicity):事务是数据库的逻辑工作单位, 事务中包括的诸操作要么都做,要么都不做
一致性(Consistency): 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态
隔离性(Isolation):一个事务的执行不能被其他事务干扰
持久性(Durability):一个事务一旦提交,它对数据库中数据的改变就应该 是永久性的。

事物隔离级别
  • 读未提交(Read Uncommitted):在该隔离级别下,一个事务可以读取其他事务未提交的数据,可能导致脏读、不可重复读和幻读的情况。

  • 读已提交(Read Committed):在该隔离级别下,一个事务只能读取已经提交的数据,可以避免脏读,但仍有不可重复读和幻读的情况。

  • 可重复读(Repeatable Read):在该隔离级别下,一个事务在执行过程中所读取的数据不会被其他事务修改,但可能存在幻读的情况。

  • 串行化(Serializable):在该隔离级别下,每个事务都是独占的,不会有其他事务干扰,可以避免脏读、不可重复读和幻读的情况,但效率较低。

  • 脏读:是指一个事务读取到了另一个事务未提交的修改数据,这种情况下,如果另一个事务回滚了,那么当前事务读到的数据就是不正确的。不可重复度:是指一个事务读取同一数据多次,但是每次读取的结果不同。这是由于在读取之间,另一个事务修改了这个数据,导致读取的结果不同。幻读:是指一个事务读取到了不存在的数据,或者读取到了已经删除的数据,因为另一个事务在读取期间插入了数据或者删除了数据。这种情况对于数据的完整性和一致性造成了严重影响。

数据库引擎

innoDB(支持事物)、MyISAM(锁、索引、备份和迁移)、Memory(内存引擎)

数据库日志

redolog:重做、undolog:回滚、binlog:二进制

MySQL索引
  1. PRIMARY KEY 索引:是唯一索引,可以用来标识表中的每一行数据。

  1. UNIQUE 索引:是唯一索引,但不同于 PRIMARY KEY 索引,可以有空值。

  1. INDEX 索引:是普通索引,可以允许多个相同的值。

  1. FULLTEXT 索引:是全文索引,用于搜索关键字和短语。

  1. SPATIAL 索引:是空间索引,用于处理空间数据。

B+索引和Hash索引:B+ 索引的优点在于,它提供了快速查询的能力,同时还支持区间查询和排序。

数据库调优

创建索引、避免在索引上使用计算、调整where连接顺序(过滤掉最大数量记录)、使用where调换having、使用表的别名、避免使用游标、使用varchar替换char、用具体的字段代替*、update尽量不要更改全部、使用select into替代insert

慢查询优化:

  1. 定期清理无用索引:无用索引的存在会影响查询性能,因此需要定期清理无用索引。可以通过查询information_schema库中的表统计信息,找出未使用的索引并进行清理。

  1. 优化查询语句:优化查询语句可以改进查询性能。一般可以从以下几个方面入手:优化SQL语句结构、增加索引、避免使用复杂查询、减少重复查询等。

聚簇索引和非聚簇索引
  • 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据

  • 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因

B+树索引

相邻叶子节点是通过指针连起来的,并且是关键字大小排序的。

数据库的锁机制
  1. 共享锁:允许多个事务同时对同一数据进行读取操作,但不允许写操作,保证数据的一致性。在事务读取数据时,会先申请共享锁,如果该数据未被排他锁占用,则可获取共享锁并进行读取,如果该数据被排他锁占用,则需要等待排他锁的释放才能获取共享锁。

  1. 排他锁:一次只允许一个事务对数据进行修改或删除操作,保证数据的完整性。在事务修改或删除数据时,会先申请排他锁,如果该数据未被其他锁占用,则可获取排他锁并进行修改或删除,如果该数据被其他锁占用,则需要等待其他锁的释放才能获取排他锁。

  • 记录锁(Record Lock):仅锁定一行记录(如固定)

  • 间隙锁(Gap Lock):锁定一个范围,但不包含记录本身

  • 临键锁:锁定一个范围,并且锁定记录本身

主要有以下类型:

  1. 行级锁:锁定数据行,只对单行数据进行加锁,其他行数据不受影响,适用于高并发场景,但可能会增加锁冲突的概率和锁开销。

  1. 表级锁:锁定整张表,适用于并发量较小的场景,但可能会导致锁等待时间过长、锁冲突较多等问题。

  1. 页级锁:锁定数据页,每个数据页可以包含多行数据,对一页数据进行加锁,适用于中等并发量的场景,可以减少锁开销和锁冲突。

  1. 数据库级锁:锁定整个数据库,对整个数据库进行加锁,适用于并发量很小的场景,但可能会导致大量锁等待和锁冲突。

索引的优缺点

索引的优点:① 建立索引的列可以保证行的唯一性,生成唯一的rowId

② 建立索引可以有效缩短数据的检索时间

③ 建立索引可以加快表与表之间的连接

④ 为用来排序或者是分组的字段添加索引可以加快分组和排序顺序

索引的缺点:① 创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大

② 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)

③ 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长

缓存问题

缓存穿透:数据本来就不存在,但是疯狂请求;

缓存雪崩:大量key值在同一个时间段过期;

缓存击穿:大量查询集中于一个或者几个key,突然这个key过期了;

CAS实现乐观锁

CAS 算法是一种原子操作,可以在不使用锁的情况下更新共享变量。它通过比较内存中的值与预期值,如果相等则更新,否则不更新。CAS 的操作过程可以分为三个步骤:

  1. 读取共享变量的当前值;

  1. 比较共享变量的当前值与预期值;

  1. 如果相等,则更新共享变量的值,否则不更新。

在 MySQL 中实现乐观锁通常可以通过以下步骤:

  1. 在表中添加一个版本号(version)字段,用于记录每次修改的版本号;

  1. 在更新数据时,通过查询当前版本号是否与预期版本号相等来判断是否有其他并发事务修改了数据;

  1. 如果版本号相等,则执行更新操作并将版本号加 1,否则返回更新失败。

MVCC实现事物隔离

在MVCC中,每个数据行都有一个版本号或时间戳。当一个事务开始时,它会读取该时刻的数据库状态,并在执行期间只看到在该时刻之前提交的版本。如果其他事务在这个事务执行期间修改了同一行数据,那么这个事务会看到该行的旧版本,而不会看到其他事务修改后的新版本。

在实现MVCC时,需要考虑以下几个方面:

  1. 版本的创建和维护:每个数据行需要创建多个版本,并在事务提交时删除旧版本。同时,需要维护每个版本的时间戳或版本号,以便事务可以读取正确的版本。

  1. 事务的启动和提交:在事务启动时,需要记录该事务的开始时间戳或版本号。在事务提交时,需要删除该事务创建的所有版本,并更新其他事务可以看到的版本号。

  1. 并发控制:为了保证事务的隔离性,需要对并发访问进行控制。通常使用锁或CAS(比较-交换)操作来控制并发访问。

MySQL的QPS从1-10000变化:
  1. 当QPS从1到10时,MySQL的性能变化不太明显。这是因为MySQL的默认配置可以轻松处理这个级别的负载。

  1. 当QPS从10到100时,MySQL的性能开始有所下降。这是因为随着查询数量的增加,MySQL需要处理更多的连接和查询请求,可能会出现性能瓶颈。

  1. 当QPS从100到1000时,MySQL的性能下降更为明显。这是因为MySQL需要处理更多的连接和查询请求,可能会出现锁竞争、磁盘I/O瓶颈等问题,需要对MySQL的配置和硬件进行优化。

  1. 当QPS从1000到10000时,MySQL的性能可能会达到极限。这是因为MySQL需要处理大量的连接和查询请求,可能会出现CPU、内存、磁盘等多个方面的瓶颈,需要对MySQL的配置和硬件进行深度优化。

五、python基础

迭代器:能够在遍历对象时依次访问对象的每一项元素。这个过程叫做迭代,因此这种对象称为迭代器。

py3和py2的区别

print在py3里是一个函数,在py2里只是一个关键字py3文件的默认编码是utf8,py2文件的默认编码是asciipy3的str是unicode字符串,而py2的str是bytespy3的range()返回一个可迭代对象,py2的 range()返回一个列表,xrange()返回一个可迭代对象,py3的除法返回float,py2的除法返回int

*args,**kwargs

  • 用来处理可变参数,接收参数后,args会变成一个tuple,kwargs会变成一个dict

垃圾回收:标记清除和分代回收
flask基础

WSGI工具包(web服务网关接口(Python Web Server Gateway Interface,缩写为WSGI)

flask执行sql:建立数据库连接、创建数据库模型(python字段)、设立游标、游标去执行sql,利用fetchall捕获执行结果。

六、分布式架构

REST 与 RPC协议

1)REST: REST 是基于 HTTP 实现,使用 HTTP 协议处理数据通信,更加标准化与通用,因为无论哪种语言都支持 HTTP 协议。常见的 http API 都可以称为 Rest 接口。REST 是一种架构风格,指一组架构约束条件和原则,满足 REST 原则的应用程序或设计就是 RESTful,RESTful 把一切内容都视为资源。REST 强调组件交互的扩展性、接口的通用性、组件的独立部署、以及减少交互延迟的中间件,它强化安全,也能封装遗留系统。

(2)RPC: RPC 是一种进程间通信方式,允许像调用本地服务一样调用远程服务,通信协议大多采用二进制方式。

RPC框架模块

一个RPC框架通常需要以下模块:

  1. 服务接口定义语言(IDL):定义服务接口的语言,通常使用IDL语言来定义接口和数据结构,以确保客户端和服务端之间的通信可以正确地序列化和反序列化。

  1. 序列化/反序列化模块:将请求和响应数据序列化为二进制流,以便在网络上传输,并在接收端将其反序列化为原始数据。

  1. 传输模块:负责将序列化后的数据在客户端和服务端之间进行传输。传输模块通常使用TCP或UDP协议进行通信。

  1. 服务注册与发现模块:服务注册与发现模块用于将服务注册到注册中心,并从注册中心查询可用的服务实例。常见的服务注册与发现框架包括Zookeeper、Consul等。

  1. 负载均衡模块:负载均衡模块用于将客户端请求分配到可用的服务实例上。负载均衡算法通常包括轮询、随机、最少连接数等。

  1. 服务容错和监控模块:服务容错和监控模块用于监控服务实例的状态,并在服务实例不可用时进行容错处理,例如重试、降级等。

负载均衡算法
  1. 轮询算法(Round Robin):将请求依次分配给每个服务器,直到所有服务器都被分配了一次请求,然后重新开始循环。这种算法适用于服务器的性能相近的情况。

  1. 随机算法(Random):将请求随机分配给服务器。这种算法简单易行,但可能会导致某些服务器的负载过高。

  1. 最少连接算法(Least Connections):将请求分配给当前连接数最少的服务器。这种算法可以避免某些服务器的负载过高,但需要实时监控每个服务器的连接数。

  1. IP哈希算法(IP Hash):根据请求的来源IP地址,将请求分配给固定的服务器。这种算法适用于需要保持会话的应用程序,但可能会导致某些服务器的负载过高。

  1. 加权轮询算法(Weighted Round Robin):将请求按照权重分配给服务器。权重越高的服务器会获得更多的请求。这种算法适用于服务器性能不同的情况。

  1. 加权最少连接算法(Weighted Least Connections):将请求按照权重分配给连接数最少的服务器。权重越高的服务器会获得更多的请求。这种算法适用于服务器性能不同的情况,并且需要实时监控每个服务器的连接数。

七、Redis

redis优缺点

优点:高性能、支持多种数据结构、支持多种数据持久化方式、支持分布式、支持高可用、简单易用等。

缺点:数据量受内存限制、不支持事务的回滚、数据持久化有数据丢失的风险、集群管理比较复杂等。

Redis 的数据结构及其使用场景

Redis 支持多种数据结构,主要包括:String、List、Set、Hash、Zset。

  • String:存储字符串类型数据,常用于缓存和计数器等场景;

  • List:存储列表类型数据,可以用于实现队列和栈等数据结构;

  • Set:存储无序的唯一值,可以用于实现类似好友关系等场景;

  • Hash:存储键值对类型的数据,常用于存储对象和实现计数器等场景;

  • Zset:有序集合,可以用于实现排行榜等场景。

持久化
  • RDB:以快照的形式将 Redis 内存中的数据写入磁盘,适用于大规模数据的备份和恢复;

  • AOF:将 Redis 内存中的写操作记录到磁盘中,适用于对数据实时性要求较高的场景。(可以保证实时性和高可用)。

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
RDB持久化保存键空间的所有键值对(包括过期字典中的数据),并以二进制形式保存,符合rdb文件规范,根据不同数据类型会有不同处理。
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
AOF持久化保存redis服务器所执行的所有写命令来记录数据库状态,在写入之前命令存储在aof_buf缓冲区。

集群模式
  • 主从复制:通过复制主节点数据到从节点,实现数据的备份和读写分离;

  • Redis Cluster:将数据分散到多个节点中,实现数据的分片和高可用。

常见指令
  1. TTL(TIME TO LIVE):某个键值对的生存时间

  1. service redis start:Linux启动redis

  1. 设置键值对:SET key value,将key和value存储到Redis中,可以用GET key获取对应的value。

  1. 获取键值对:GET key,获取key对应的value。

  1. 设置过期时间:EXPIRE key seconds,将key设置为在seconds秒之后过期。

  1. 判断key是否存在:EXISTS key,返回key是否存在的结果。

  1. 自增:INCR key,将key对应的value自增1,支持浮点数自增INCRBYFLOAT key increment。

  1. 列表操作:LPUSH key value,将value插入到key对应的列表的头部,可以用LRANGE key start stop获取指定范围的列表元素。

  1. 集合操作:SADD key member,将member添加到key对应的集合中,可以用SMEMBERS key获取集合中的所有元素。

  1. 有序集合操作:ZADD key score member,将member添加到key对应的有序集合中,并指定一个分数score,可以用ZRANGE key start stop获取指定范围的有序集合元素。

  1. 批量操作:MSET key1 value1 key2 value2 ...,一次性设置多个键值对,可以用MGET key1 key2 ...获取多个key对应的value。

  1. 事务操作:MULTI,开始一个事务,EXEC,提交一个事务,DISCARD,取消一个事务。

缓存穿透、缓存雪崩、缓存击穿

缓存穿透:我们使用Redis大部分情况都是通过Key查询对应的值,假如发送的请求传进来的key是不存在Redis中的,那么就查不到缓存,查不到缓存就会去数据库查询。假如有大量这样的请求,这些请求像“穿透”了缓存一样直接打在数据库上,这种现象就叫做缓存穿透。

缓存雪崩:当某一个时刻出现大规模的缓存失效的情况,那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。这就是缓存雪崩。

缓存击穿:跟缓存雪崩有点类似,缓存雪崩是大规模的key失效,而缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,导致大并发全部打在数据库上,导致数据库压力剧增。这种现象就叫做缓存击穿。

八、RabbitMQ

为什么要用RabbitMQ

流量消峰:将短时间内需要处理的订单,全部分散到队列内一次处理。

应用解耦:减少系统之间的调用,防止以者破坏,整个系统崩溃。

异步处理:异步非阻塞,异步编程处理完后可以通知需要的程序。

RabbitMQ优缺点

RabbitMQ的优点包括:

  1. 异步消息传递:RabbitMQ允许应用程序在不同的进程和不同的机器之间进行异步消息传递,避免了系统崩溃的风险。

  1. 可靠性:RabbitMQ采用了多种机制来保证消息传递的可靠性,包括持久化、重试、错误处理等。

  1. 可扩展性:RabbitMQ允许在不停机的情况下增加或减少队列、节点等。

  1. 灵活性:RabbitMQ支持多种消息模型,包括点对点、发布/订阅等,还支持多种交换机类型、路由方式等。

RabbitMQ的缺点包括:

  1. 性能瓶颈:在高并发场景下,RabbitMQ可能会成为系统的性能瓶颈。

  1. 配置复杂:RabbitMQ需要根据业务需求进行配置,对于不熟悉其机制的用户而言,配置可能会比较复杂。

  1. 代码侵入性:使用RabbitMQ需要编写与其相关的代码,会对代码结构产生侵入性。

核心概念
  1. 生产者(Producer):发送消息的程序。

  1. 消息队列(Message Queue):存储消息的队列。

  1. 消费者(Consumer):接收并处理消息的程序。

  1. 绑定(Binding):生产者将消息发送到交换机时需要指定一个绑定键,消费者可以根据绑定键从交换机中接收消息。

  1. 交换机(Exchange):接收生产者发送的消息,并根据绑定键将消息发送到相应的队列中。

消息传递模型:AMQP (Advanced Message Queuing Protocol),生产者-消费者模型,其中生产者将消息发送到队列中,而消费者从队列中接收并处理消息。

启动命令:rabbit-service start

九、Linux基础

Linux命令
  1. ls:列出目录中的文件和子目录。

  1. cd:切换当前目录。

  1. pwd:显示当前目录的路径。

  1. mkdir:创建新目录。

  1. rmdir:删除空目录。

  1. rm:删除文件或目录。

  1. cp:复制文件或目录。

  1. mv:移动或重命名文件或目录。

  1. cat:查看文件内容。

  1. grep:在文件中查找匹配的字符串。

  1. top:实时显示系统的进程状态。

  1. ps:列出当前系统中的进程信息。

  1. kill:终止指定的进程。

  1. tar:打包或解压文件或目录。

  1. chmod:修改文件或目录的权限。

  1. chown:修改文件或目录的所有者。

  1. ssh:远程登录到另一台计算机。

  1. scp:安全地复制文件或目录到远程计算机。

  1. ping:测试网络连接。

  1. ifconfig:显示网络接口信息

  1. netstat:查看端口信息

  1. df:磁盘使用情况

  1. tail:查看日志信息

十、前端基础

webpack的作用
  1. 模块化处理:将代码按照模块化的方式组织起来,方便代码的维护和管理。

  1. 编译打包:将各种前端资源进行编译和打包,使其能够被浏览器识别和使用。

  1. 代码优化:对代码进行压缩、去重等优化操作,减小代码体积,提高页面加载速度。

  1. 静态资源管理:管理静态资源,如图片、字体等,方便页面的加载和使用。

  1. 开发调试:提供了丰富的插件和工具,方便开发调试,提高开发效率。

webpack常用命令
  1. webpack:执行默认的打包操作。

  1. webpack --config:指定配置文件路径。

  1. webpack --watch:监控文件变化并自动重新打包。

  1. webpack-dev-server:启动一个开发服务器。

  1. webpack --mode:指定打包模式(development、production)。

  1. webpack --progress:显示打包进度。

  1. webpack --color:打包输出带有颜色。

  1. webpack --display-modules:显示打包模块信息。

  1. webpack --display-reasons:显示打包模块被引入的原因。

  1. webpack --display-error-details:显示打包错误详情。

跨域问题

跨域问题是由浏览器的同源策略引起的,同源策略要求协议、域名、端口号必须完全一致才可以相互通信。如果不满足同源策略,就会导致跨域问题。

解决跨域问题的方法有以下几种:

  1. JSONP:利用 script 标签可以跨域的特性,将需要获取的数据包装在一个回调函数中,前端通过该回调函数获取数据。缺点是只能用于 get 请求。

  1. CORS(跨域资源共享):是一种浏览器允许跨域访问资源的机制,需要服务器设置相应的响应头。

  1. 代理:在服务器端设置代理服务器,将跨域请求转发到目标服务器,再将结果返回给前端。

  1. iframe:通过在当前页面插入一个隐藏的 iframe,将需要跨域的页面嵌入到 iframe 中,前端通过操作 iframe 中的页面来实现跨域。

  1. WebSocket:WebSocket 协议不受同源策略的限制,可以在客户端与服务端之间建立一条长连接,实现实时通信。

面试
  1. JavaScript基础知识:变量、数据类型、作用域、闭包、this、原型链、事件循环、异步编程等等。

  1. HTML和CSS:HTML标签、语义化、CSS盒模型、选择器、布局、响应式设计、CSS预处理器等等。

  1. 框架和库:React、Vue、Angular等前端框架或库的原理、生命周期、组件通信、性能优化等等。

  1. 网络和安全:HTTP协议、缓存、跨域、XSS、CSRF等前端安全问题。

  1. 工程化和工具:Webpack、Babel、ESLint等前端工具的使用和原理、模块化、性能优化等等。

  1. 算法和数据结构:数组、链表、栈、队列、排序算法、查找算法等等。

  1. 项目经验:面试官可能会问到你在过去的项目中遇到的问题、如何解决问题、团队协作等等。

js数据类型
  1. 数值(Number):代表数字,例如 42 或 3.14159。

  1. 字符串(String):代表文本,例如 "Hello, world!"。

  1. 布尔值(Boolean):代表真假,即 true 或 false。

  1. undefined:当变量被声明但未赋值时,其值为 undefined。

  1. null:表示一个空值或缺失值。

  1. 对象(Object):表示一个可变的键值对集合。对象可以包含其他对象、数组、函数等。

  1. 符号(Symbol):表示唯一的标识符,通常用于对象的属性名。

作用域

全局作用域:全局作用域是指变量或函数在代码的任何地方都可以被访问。

局部作用域:局部作用域是指变量或函数只能在其定义的代码块内部访问。

闭包

在函数内部创建的一个独立的作用域,该作用域内包含了函数定义时所能访问到的所有局部变量和参数,即使在函数执行完毕后,这些变量依然存在于内存中,可以在函数外部被访问到。

原型链

当我们访问一个对象的属性或方法时,JavaScript会首先在该对象本身查找该属性或方法,如果找不到,就会去该对象的原型对象(父对象)中查找,如果还找不到,就会继续沿着原型链向上查找,直到找到该属性或方法或者到达原型链的顶端(即Object.prototype)为止。

事件循环

实现异步编程的机制,在JavaScript中,事件循环分为两个阶段:执行栈和任务队列。执行栈是一个存储函数调用的栈结构,每当一个函数被调用时,它就会被压入执行栈中,当函数执行完毕时,它就会从执行栈中弹出。

任务队列是一个存储事件、回调函数等异步任务的队列,当异步任务完成时,它就会被放入任务队列中。当执行栈中的所有任务都执行完毕时,事件循环就会从任务队列中取出一个任务并将其放入执行栈中执行,这个过程会一直循环下去,直到任务队列为空。

计算机基础面试(持续更新中)相关推荐

  1. 幻想-FLEX 3基础视频教程 持续更新中

    欢迎点击此处订阅本Blog title="RSS 2.0" type="application/rss+xml" href="http://feed. ...

  2. JAVA基础(持续更新中)

    JAVA基础 2020年11月27日 21:01 1 预科 a. 什么是计算机 能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备. 由硬件常见的形式有台式计算机.笔记本计算机.大型计算机等 ...

  3. Node.js零基础自学(持续更新中)

    1. Node.js时基于Chrome V8 引擎的JavaScript运行环境.官网:Node.jsNode.js® is a JavaScript runtime built on Chrome' ...

  4. 计算机基础面试——持续总结

    文章目录 1.TCP和UDP的区别? 2.TCP的三次握手和四次挥手? 3.HTTP和HTTPS的区别? 4.HTTP请求的报文格式和常见状态码? 5.一次完整的HTTP请求流程?(在浏览器输入URL ...

  5. 计算机组成原理笔记(持续更新中!)

    (标三角号的相比之下不是非常重要) 文章目录 1 导论 ▲1.1 计算机的发展历程 1.1.1 计算机软硬件的发展 1.1.2计算机的分类与发展方向 1.2 计算机系统的组成 1.2.1 系统结构 1 ...

  6. 前端使用Canvas绘图(基础知识)--持续更新中

    文章目录 前言 canvas文档 一.canvas代码提示(插件和注释) 1.1.使用插件方式(推荐这种方式) =>canvas-snippets 1.2.使用注释方式 二.初始canvas 2 ...

  7. jQuery学习总结之基础知识----持续更新中

    语法总结和注意事项 1.关于页面元素的引用 通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象 ...

  8. 前端基础知识(持续更新中)

    HTML Hyper Text Markup Language 超文本标记语言 1.html5为什么只需要写<! DOCTYPE HTML> 答:这是w3c制定的规则,是文档类型声明,语义 ...

  9. 嵌入式相关开源项目、库、资料------持续更新中

    学习初期最难找的就是找学习资料了,本贴精心汇总了一些嵌入式相关资源,包括但不限于编程语言.单片机.开源项目.物联网.操作系统.Linux.计算机等资源,并且在不断地更新中,致力于打造全网最全的嵌入式资 ...

  10. 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)

    这篇文章为本专栏所有力扣题目提供目录链接, 更加方便读者根据题型或面试频率进行阅读, 此外也会介绍我在刷题过程中总结的刷算法题目的顺序/注意点/技巧, 最后说下文中出现的思维导图源文件的问题 和 打卡 ...

最新文章

  1. 24 location对象
  2. 《图解HTTP》读书笔记--第7章 确保Web安全的HTTPS
  3. FastAPI使用async?乱用async导致灾难,不如直接不用
  4. websocket学习笔记
  5. [JavaWeb-JavaScript]JavaScript_Math数学对象
  6. 计算机视觉中的牛人贡献及其主页
  7. python的array从0开始吗_为什么数组是从0开始的
  8. 新版本chrome浏览器带来的跨域请求cookie丢失问题
  9. 海信信号机后台服务器配置,海信自适应交通信号控制系统解决方案
  10. 项目经理需要具备的技能
  11. 考研408-计算机组成原理-存储系统
  12. 计算机强制关机后无法正常启动,电脑强制关机后无法正常启动,一直黑屏,这是为什么呢?...
  13. 重置计算机网络配置后上不了网,win10系统网络重置后不能连接网络如何解决
  14. Excel计算工作日的公式
  15. 编码:隐匿在计算机软硬件背后的语言pdf-Code:The Hidden Language of Computer Hardware and Software-Charles Petzold-pdf
  16. c语言英语教学大纲,C语言教学大纲.doc
  17. 计算机显示在屏幕上怎么取消,电脑显示屏显示的九宫格怎样取消掉
  18. Bokeh Graph
  19. python由当前时间计算上周一、周日的日期时间
  20. 登录这个轮子,你还在造?

热门文章

  1. 【微服务】Day01(Vant、SpringCloud)
  2. ADB入门(二)-连接篇
  3. 2021/04/25 SpringBoot + SpringCloud微服务项⽬交付案例
  4. Python为文件夹下所有Excel工作簿的所有sheet截图
  5. 如何自动将Word文档缩小一页
  6. 【rnnoise源码分析】band能量计算
  7. Think Before You Speak: Explicitly Generating Implicit Commonsense Knowledge for Response Generation
  8. Power Pivot制作切片器姓名索引
  9. An Image is worth 16*16 words: Transformers for image recognition at scale.
  10. Python编写学籍管理系统