优化思路:
- 尽量避免发送 HTTP 请求
- 迫不得已要发送 HTTP 请求时,尽量减少请求次数
- 减少服务器的 HTTP 响应的数据大小
聊聊缓存三兄弟:雪崩、击穿、穿透
数据一般都是存储在数据库中,数据库的数据一般是存储在磁盘中的,磁盘的 IO 速度可以说是计算机中最慢的硬件了。这种情况下,当用户的请求都访问数据库的话,请求数量一上来,数据库就很容易崩溃了,所以为了避免用户直接访问数据库,会选用 IO 速度更高的内存数据库(比如 Redis)来做缓存层,内存的 IO 速度比硬盘快好几个量级,这样也就大大提升了系统性能。
但是呢,引入了缓存层,就会有缓存异常的三个问题:
- 缓存雪崩
- 缓存击穿
- 缓存穿透
记录下 2024-03-09 团子的第一次笔试
时间:2024-03-09 10:00 - 12:00
战况:3.5 / 5
谈谈 MySQL InnoDB 是如何加行级锁的
哪些 SQL 会加行级锁?
除去串行化隔离级别情况,普通的 SELECT 语句是不会对记录加锁的,因为它属于快照读,是通过 MVCC 实现的。
如果要在查询时对记录加行级锁,可以使用锁定读:
SELECT ... LOCK IN SHARE MODE; # 对读取的记录加共享锁 |
上面这两条语句必须在处于事务环境中,因为当事务提交了,锁就会被释放,所以在使用这两条语句的时候,需要开启事务,否则和普通读没有什么区别。
除了锁定读语句会加行级锁之外,UPDATE 和 DELETE 操作都会加行级锁,且锁的类型都是独占锁。
共享锁(S锁)满足读读共享,读写互斥。独占锁(X锁)满足写写互斥、读写互斥。
MySQL 锁的那些事
TCP 为什么是三次握手?
首先需要明确一个概念,TCP 连接是用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket、序列号和窗口大小称为连接。
因此,重要的是,为什么三次握手才可以初始化 Socket、序列号和窗口大小并建立 TCP 连接。
原因主要是以下三个方面:
- 三次握手才可以阻止重复历史连接的初始化(主要原因)
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
关于 TCP 中 TIME_WAIT 那些事
什么是 TIME_WAIT
「TCP 四次挥手过程」
- 客户端打算关闭连接,此时会发送一个 TCP 首部
FIN
标志位被置为1
的报文,也即FIN
报文,之后客户端进入FIN_WAIT_1
状态; - 服务端收到该报文后,就向客户端发送
ACK
应答报文,接着服务端进入CLOSE_WAIT
状态; - 客户端收到服务端的
ACK
应答报文后,之后进入FIN_WAIT_2
状态; - 等待服务端处理完数据后,也向客户端发送
FIN
报文,之后服务端进入LAST_ACK
状态; - 客户端收到服务端的
FIN
报文后,回一个ACK
应答报文,之后进入TIME_WAIT
状态; - 服务端收到了
ACK
应答报文后,就进入了CLOSE
状态,至此服务端已经完成连接的关闭; - 客户端在经过
2MSL
一段时间后,自动进入CLOSE
状态,至此客户端也完成连接的关闭。
⚠️注意:主动关闭连接的,才有 TIME_WAIT 状态。
刷一道算法题 —— 两数相除
题目链接:29. 两数相除
给你两个整数,被除数 dividend
和除数
divisor
。将两数相除,要求 不使用
乘法、除法和取余运算。
整数除法应该向零截断,也就是截去(truncate
)其小数部分。例如,8.345
将被截断为 8
,-2.7335
将被截断至
-2
。
返回被除数 dividend
除以除数 divisor
得到的
商 。
注意:假设我们的环境只能存储 32 位
有符号整数,其数值范围是 [−2^31, 2^31 − 1]
。本题中,如果商
严格大于 2^31 − 1
,则返回
2^31 − 1
;如果商 严格小于
-2^31
,则返回 -2^31
。
示例 1:
输入: dividend = 10, divisor = 3 |
示例 2:
输入: dividend = 7, divisor = -3 |
提示:
-2^31 <= dividend, divisor <= 2^31 - 1
divisor != 0