youyichannel

志于道,据于德,依于仁,游于艺!

0%

优化思路:

  • 尽量避免发送 HTTP 请求
  • 迫不得已要发送 HTTP 请求时,尽量减少请求次数
  • 减少服务器的 HTTP 响应的数据大小
阅读全文 »

数据一般都是存储在数据库中,数据库的数据一般是存储在磁盘中的,磁盘的 IO 速度可以说是计算机中最慢的硬件了。这种情况下,当用户的请求都访问数据库的话,请求数量一上来,数据库就很容易崩溃了,所以为了避免用户直接访问数据库,会选用 IO 速度更高的内存数据库(比如 Redis)来做缓存层,内存的 IO 速度比硬盘快好几个量级,这样也就大大提升了系统性能。

但是呢,引入了缓存层,就会有缓存异常的三个问题:

  • 缓存雪崩
  • 缓存击穿
  • 缓存穿透
阅读全文 »

哪些 SQL 会加行级锁?

除去串行化隔离级别情况,普通的 SELECT 语句是不会对记录加锁的,因为它属于快照读,是通过 MVCC 实现的。

如果要在查询时对记录加行级锁,可以使用锁定读

SELECT ... LOCK IN SHARE MODE; # 对读取的记录加共享锁

SELECT ... FOR UPDATE; # 对读取的记录加独占锁

上面这两条语句必须在处于事务环境中,因为当事务提交了,锁就会被释放,所以在使用这两条语句的时候,需要开启事务,否则和普通读没有什么区别。

除了锁定读语句会加行级锁之外,UPDATE 和 DELETE 操作都会加行级锁,且锁的类型都是独占锁。

共享锁(S锁)满足读读共享,读写互斥。独占锁(X锁)满足写写互斥、读写互斥。

阅读全文 »

首先需要明确一个概念,TCP 连接是用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket、序列号和窗口大小称为连接。

因此,重要的是,为什么三次握手才可以初始化 Socket、序列号和窗口大小并建立 TCP 连接

原因主要是以下三个方面:

  1. 三次握手才可以阻止重复历史连接的初始化(主要原因)
  2. 三次握手才可以同步双方的初始序列号
  3. 三次握手才可以避免资源浪费
阅读全文 »

什么是 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
输出: 3
解释: 10/3 = 3.33333.. ,向零截断后得到 3 。

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。

提示:

  • -2^31 <= dividend, divisor <= 2^31 - 1
  • divisor != 0
阅读全文 »