自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小林coding

公众号:「小林coding」 专注图解计算机基础,期待你的关注!

  • 博客(174)
  • 收藏
  • 关注

原创 图解计算机基础网站上线了

大家好,我是小林。就在昨天 4 点半,我收到了工信部的短信,通知了我的域名备案完成了!足足等待了一周,域名终于备案完了,久等了各位!心急的小伙伴,可以到末尾见直接看网站域名。在此之间,我先来介绍(吹一吹)网站。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qjl4DVdW-1648020981377)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgY

2022-03-23 15:38:05 11532 10

原创 执行 select ... for update 语句,如果查询条件没有索引字段的话,是加行锁还是加表锁?

很有争议的问题

2022-12-18 16:37:12 5170 9

原创 MySQL 的 NULL 是怎么存储的?

大家好,我是小林。之前有位读者在面字节的时候,被问到这么个问题:如果你知道 MySQL 一行记录的存储结构,那么这个问题对你没什么难度。如果你不知道也没关系,这次我跟大家聊聊 MySQL 一行记录是怎么存储的?知道了这个之后,除了能应解锁前面这道面试题,你还会解锁这些面试题:

2022-12-01 14:09:10 3585 6

原创 MySQL 是怎么加行级锁的?为什么一会是 next-key 锁,一会是间隙锁,一会又是记录锁?

是不是很多人都对 MySQL 加行级锁的规则搞的迷迷糊糊,一会是 next-key 锁,一会是间隙锁,一会又是记录锁。坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如何用命令分析加了什么类型的行级锁。

2022-11-14 12:08:35 1887 1

原创 TCP 序列号和确认号是如何变化的?

大家好,我是小林。在上回答了很多人的问题,我发现很多人对 TCP 序列号和确认号的变化都是懵懵懂懂的,只知道三次握手和四次挥手过程中,ACK 报文中确认号要 +1,然后数据传输中 TCP 序列号和确认号的变化就不知道了。也有很多同学跟我反馈,希望我写一篇关于 TCP 序列号和确认号变化过程的文章。大家别小看这个基础知识点,其实很多人都不知道的。所以,这次就跟大家聊聊以下过程中,TCP 序列号和确认号是如何变化的?

2022-10-26 16:48:19 4384 2

原创 字节一面:TCP 三次握手,问的好细!

大家好,我是小林。有位读者在面试字节时,被问到这么个问题:TCP 三次握手中,客户端收到的第二次握手中 ack 确认号不是自己期望的,会发生什么?是直接丢弃 or 回 RST 报文?

2022-10-24 10:35:08 7878 1

原创 MySQL 全局锁、表级锁、行级锁,你搞清楚了吗?

大家好,我是小林。最近重新补充些内容,所以,现在内容还是比较全面的,基本把 MySQL 用到的锁都说了一遍,大家可以在复习复习。

2022-10-24 10:33:10 1812

原创 Eolink实践 | 基于DevOps的持续测试策略

可以通过非常简单的 脚本来编写复杂的 API 测试用例,实现自动化测试中复杂的流程跳转、数据加解密、验签等目的。可进行 API 之间参数传递:无需学习变量和脚本语法,通过界面可以直接设置复杂的参数传递规则,如将注册后的 Token 传递给登录 API,将登录后的 Cookie 传递给后续 API 进行 鉴权等。通过实施扩展自动化测试的策略来覆盖更多的平台。但是,当我们使用正确的测试自动化工具时,可以确保在更快的时间内覆盖更多的平台。当我们大规模并行运行,并使用正确的工具时,我们可以加快上线的时间。

2022-10-24 10:26:45 3287 6

原创 贼好用的自动化测试工具:Apipost!

对于一个互联网公司来说,测试人员是公司里不可缺少的一个角色。但从事软件测试的人员不计其数,每年都有很多毕业生卷入互联网的大军。如果一个测试人员的能力还只停留在点点点上,自然是会被新一代的“卷王”们淘汰的。于是掌握自动化测试,便成了很多测试人员提升职场竞争力的一条必经之路。但通常意义的自动化测试,相对门槛较高,需要具备一定的代码能力。比如我们通常使用的 Jmeter,虽然功能强大全面,但也被很多测试人员评价存在上手困难,操作繁琐,测试报告不完整清晰,发现问题不易追溯查找等问题。

2022-09-16 13:54:02 2158

原创 Redis 的大 Key 对持久化有什么影响?

当 AOF 写回策略配置了 Always 策略,如果写入是一个大 Key,主线程在执行 fsync() 函数的时候,阻塞的时间会比较久,因为当写入的数据量很大的时候,数据同步到硬盘这个过程是很耗时的。AOF 重写机制和 RDB 快照(bgsave 命令)的过程,都会分别通过fork()函数创建一个子进程来处理任务。创建子进程的途中,由于要复制父进程的页表等数据结构,阻塞的时间跟页表的大小有关,页表越大,阻塞的时间也越长;

2022-09-13 13:57:42 2485 2

转载 MySQL 单表不要超过 2000W 行,靠谱吗?

但是在一开始生成页的时候,其实并没有 User Records 这个部分,每当我们插入一条记录,都会从 Free Space 部分,也就是尚未使用的存储空间中申请一个记录大小的空间划分到 User Records 部分,当 Free Space 部分的空间全部被 User Records 部分替代掉之后,也就意味着这个页使用完了,如果还有新的记录插入的话,就需要去申请新的页了。但是叶子节点中存放的是真正的行数据,这个影响的因素就会多很多,比如,字段的类型,字段的数量。

2022-09-11 17:20:01 1478

原创 MySQL 可重复读隔离级别,解决幻读了吗?

翻译:当同一个查询在不同的时间产生不同的结果集时,事务中就会出现所谓的幻象问题。例如,如果 SELECT 执行了两次,但第二次返回了第一次没有返回的行,则该行是“幻像”行。T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 6 条行记录,那就发生了幻读的问题。T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 4 条行记录,也是发生了幻读的问题。MySQL 是怎么解决幻读的?针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读。

2022-09-11 17:09:55 1811

原创 服务端挂了,客户端的 TCP 连接还在吗?

如果「服务端挂掉」指的是「服务端进程崩溃」,服务端的进程在发生崩溃的时候,内核会发送 FIN 报文,与客户端进行四次挥手。但是,如果「服务端挂掉」指的是「服务端主机宕机」,那么是不会发生四次挥手的,具体后续会发生什么?还要看客户端会不会发送数据?如果客户端会发送数据,由于服务端已经不存在,客户端的数据报文会超时重传,当重传总间隔时长达到一定阈值(内核会根据 tcp_retries2 设置的值计算出一个阈值)后,会断开 TCP 连接;

2022-09-06 13:24:48 3133 1

原创 TCP 三次握手和四次挥手,中间失败了会发生什么?

作者:小林coding大家好,我是小林。之前写过 TCP 三次握手和四次挥手过程中,途中某一步的报文丢失会发生什么的文章。当时,主要是文字描述,可能不太好记忆,所以我针对每一步的异常情况,,方便大家理解和记忆。发车!当客户端想和服务端建立 TCP 连接的时候,首先第一个发的就是 SYN 报文,然后进入到SYN_SENT状态。在这之后,如果客户端迟迟收不到服务端的 SYN-ACK 报文(第二次握手),就会触发「超时重传」机制,重传 SYN 报文,而且。...

2022-08-28 10:03:19 3545

原创 TCP 四次挥手,可以变成三次挥手吗?

当被动关闭方在 TCP 挥手过程中,如果「没有数据要发送」,同时「没有开启 TCP_QUICKACK(默认情况就是没有开启,没有开启 TCP_QUICKACK,等于就是在使用 TCP 延迟确认机制)」,那么第二和第三次挥手就会合并传输,这样就出现了三次挥手。所以,出现三次挥手现象,是因为 TCP 延迟确认机制导致的。完!......

2022-08-27 18:32:17 4481 4

原创 HTTPS 一定安全可靠吗?

大家好,我是小林。这个问题的场景是这样的:客户端通过浏览器向服务端发起 HTTPS 请求时,被「假基站」转发到了一个「中间人服务器」,于是客户端是和「中间人服务器」完成了 TLS 握手,然后这个「中间人服务器」再与真正的服务端完成 TLS 握手。从客户端的角度看,其实并不知道网络中存在中间人服务器这个角色。那么中间人就可以解开浏览器发起的 HTTPS 请求里的数据,也可以解开服务端响应给浏览器的 HTTPS 响应数据。相当于,中间人能够 “偷看” 浏览器与服务端之间的 HTTPS 请求和响应的数据。

2022-08-23 11:50:06 2000

原创 Redis 大 key 要如何处理?

大 key 并不是指 key 的值很大,而是 key 对应的 value 很大。String 类型的值大于 10 KB;Hash、List、Set、ZSet 类型的元素的个数超过 5000个;

2022-08-08 12:14:31 5080

原创 服务端没有 listen,客户端发起连接建立,会发生什么?

TCP 同时打开的情况也类似,只不过从一个客户端变成了两个客户端而已。做个实验。

2022-08-06 15:03:09 2706

原创 如何用 Redis 实现分布式锁的?

今天跟大家聊聊两个问题:如何用 Redis 实现分布式锁?Redis 是如何解决集群情况下分布式锁的可靠性问题的?

2022-07-25 15:53:07 1867

原创 三种缓存策略:Cache Aside 策略、Read/Write Through 策略、Write Back 策略

我是小林。今天跟大家聊聊,常见的缓存更新策略。实际开发中,Redis和MySQL的更新策略用的是CacheAside,另外两种策略主要应用在计算机系统里。

2022-07-19 12:41:23 4855

原创 面试官:你确定 Redis 是单线程的进程吗?

这次主要分享 Redis 线程模型篇的面试题。Redis 是单线程吗?Redis 单线程模式是怎样的?Redis 采用单线程为什么还这么快?Redis 6.0 之前为什么使用单线程?Redis 6.0 之后为什么引入了多线程?

2022-07-18 13:26:08 2787 1

原创 面试官:Redis 过期删除策略和内存淘汰策略有什么区别?

大家好,我是小林。Redis 的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都是做删除的操作,但是触发的条件和使用的策略都是不同的。今天就跟大家理一理,「内存淘汰策略」和「过期删除策略」。发车!Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将已过期的键值对删除,而做这个工作的就是过期键值删除策略。先说一下对 key 设置过期时间的命令。设置 key 过期时间的命令一共有 4 个:当然,在设置字符串时,也可以同时对 key 设置过期时间,共有 3 种命令:如果你

2022-07-04 09:32:53 2255 3

原创 2 万字 + 30 张图 |MySQL 日志:undo log、redo log、binlog 有什么用?

大家好,我是小林。从这篇「执行一条 SQL 查询语句,期间发生了什么?」中,我们知道了一条查询语句经历的过程,这属于「读」一条记录的过程,如下图:那么,执行一条 update 语句,期间发生了什么?,比如这一条 update 语句:查询语句的那一套流程,更新语句也是同样会走一遍:不过,更新语句的流程会涉及到 undo log(回滚日志)、redo log(重做日志) 、binlog (归档日志)这三种日志:所以这次就带着这个问题,看看这三种日志是怎么工作的。我们在执行执行一条“增删改”语句的时候,虽然没

2022-06-21 13:07:26 2353 1

原创 2 万字 + 20张图| 细说 Redis 九种数据类型和应用场景

大家好,我是小林。我们都知道 Redis 提供了丰富的数据类型,常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。随着 Redis 版本的更新,后面又支持了四种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)。每种数据对象都各自的应用场景,你能说出它们各自的应用场景吗?面试过程中,这个问题也很常被问到,又比如会举例一个应用场景来问你,让你说使用哪种 Re

2022-06-13 14:40:06 3002 2

原创 在 4GB 物理内存的机器上,申请 8G 内存会怎么样?

大家好,我是小林。看到读者在群里讨论这些面试题:其中,第一个问题「在 4GB 物理内存的机器上,申请 8G 内存会怎么样?」存在比较大的争议,有人说会申请失败,有的人说可以申请成功。这个问题在没有前置条件下,就说出答案就是耍流氓。这个问题要考虑三个前置条件:所以,我们要分场景讨论。应用程序通过 malloc 函数申请内存的时候,实际上申请的是虚拟内存,此时并不会分配物理内存。当应用程序读写了这块虚拟内存,CPU 就会去访问这个虚拟内存, 这时会发现这个虚拟内存没有映射到物理内存, CPU 就会产生缺页中断,

2022-06-08 10:58:48 14095 8

原创 字节一面:如何用 UDP 实现可靠传输?

大家好,我是小林。我记得之前在群里看到,有位读者字节一面的时候被问到:「如何基于 UDP 协议实现可靠传输?」很多同学第一反应就会说把 TCP 可靠传输的特性(序列号、确认应答、超时重传、流量控制、拥塞控制)在应用层实现一遍。实现的思路确实这样没错,但是有没有想过,既然 TCP 天然支持可靠传输,为什么还需要基于 UDP 实现可靠传输呢?这不是重复造轮子吗?所以,我们要先弄清楚 TCP 协议有哪些痛点?而这些痛点是否可以在基于 UDP 协议实现的可靠传输协议中得到改进?在之前这篇文章:TCP 就没什么缺陷吗

2022-06-06 12:34:44 2928

原创 开发者 API 管理神器 Eolink,比 postman 好用

最近,发现了一个开发者的 API 管理神器,功能很强大,但是页面不臃肿,很简洁。这款神器可以直接在上面设计 API 接口,然后可以直接生成 API 接口文档,这简直就是懒癌的福音,而且也有团队协作能力,这样在上面修改 API 接口时,团队的小伙伴都能实时看的见,大大提高了团队的接口对接和测试工作的效率。经过我的推荐,身边有不少小伙伴,都逐渐告别postman、swagger等产品,开始选择这款 API 管理神器。这款低调但实力强大的API管理神器就是:Eolink!功能强大。API 版本管理、返回复

2022-05-25 14:24:58 2381

原创 腾讯一面:内存满了,会发生什么?

作者:小林coding计算机八股文刷题网站:https://xiaolincoding.com大家好,我是小林。前几天有位读者留言说,面腾讯时,被问了两个内存管理的问题:先来说说第一个问题:虚拟内存有什么作用?第一,由于每个进程都有自己的页表,所以每个进程的虚拟内存空间就是相互独立的。进程也没有办法访问其他进程的页表,所以这些页表是私有的。这就解决了多进程之间地址冲突的问题。第二,页表里的页表项中除了物理地址之外,还有一些标记属性的比特,比如控制一个页的读写权限,标记该页是否存在等。在.

2022-05-24 10:19:36 4508 4

原创 为什么 Redis 要有哨兵机制?

作者:小林coding计算机八股文刷题网站:https://xiaolincoding.com大家好,我是小林。这次聊聊,Redis 的哨兵机制。为什么要有哨兵机制?在 Redis 的主从架构中,由于主从模式是读写分离的,如果主节点(master)挂了,那么将没有主节点来服务客户端的写操作请求,也没有主节点给从节点(slave)进行数据同步了。这时如果要恢复服务的话,需要人工介入,选择一个「从节点」切换为「主节点」,然后让其他从节点指向新的主节点,同时还需要通知上游那些连接 Redis .

2022-05-19 10:46:31 3258 2

原创 一个霸占程序员休息时间的 APP

不知道大家有没有这个困惑。自己在学习一门技术的时候,虽然说看书是最好的方式,但是有些经典书出版很久了,有些知识点可能过时了,又或者学到的东西不知道怎么应用到工作,同时看书时遇到的问题也没办法向原作者提问。还记得在 18 年的时候,我在朋友圈看到有朋友分享了个课程海报:《趣谈网络协议》和《数据结构与算法之美》。当时很新奇,我去扫码看了下,原来一个专注于 IT 领域的专栏课程 APP —— 极客时间。我立马下载去看了看,那时候这个 APP 刚出来,专栏课程不多,大概就 5 门课程左右,都是业内的大佬写的专

2022-05-17 12:44:11 5750 1

原创 TCP 协议有什么缺陷?

作者:小林coding图解计算机基础网站:https://xiaolincoding.com大家好,我是小林。忽然思考一个问题,TCP 通过序列号、确认应答、超时重传、流量控制、拥塞控制等方式实现了可靠传输,看起来它很完美,事实真的是这样吗?TCP 就没什么缺陷吗?所以,今天就跟大家聊聊,TCP 协议有哪些缺陷?主要有四个方面:升级 TCP 的工作很困难;TCP 建立连接的延迟;TCP 存在队头阻塞问题;网络迁移需要重新建立 TCP 连接;接下来,针对这四个方面详细说一下。升级 .

2022-05-09 15:00:18 5615 4

原创 为什么要有虚拟内存?

4.1 为什么要有虚拟内存?本篇跟大家说说内存管理,内存管理还是比较重要的一个环节,理解了它,至少对整个操作系统的工作会有一个初步的轮廓,这也难怪面试的时候常问内存管理。干就完事,本文的提纲:虚拟内存如果你是电子相关专业的,肯定在大学里捣鼓过单片机。单片机是没有操作系统的,所以每次写完代码,都需要借助工具把程序烧录进去,这样程序才能跑起来。另外,单片机的 CPU 是直接操作内存的「物理地址」。在这种情况下,要想在内存中同时运行两个程序是不可能的。如果第一个程序在 2000 的位置写入一个新

2022-04-28 19:37:18 5494 8

原创 我发现 Linux 文档写错了

大家好,我是小林。周末的时候,有位读者疑惑为什么 Linux man 手册中关于 netstat 命令中的 tcp listen 状态下的 Recv-Q 和 Send-Q 这两个信息的描述跟我的图解网络写的不一样?我先给大家翻译一下,man 手册是怎么说的:Recv-Q:如果 TCP 连接状态处于 Established,Recv-Q 的数值表示内核中还没拷贝到应用层的数据大小;如果 TCP 连接状态处于 Listen 状态,Recv-Q 的数值表示当前 syn 半连接队列的大小(自内核 2

2022-04-25 14:44:34 6194 4

原创 为什么 TIME_WAIT 状态的 TCP 连接,收到 SYN 报文后,可以正常建立连接?

大家好,我是小林。昨天群里有个读者问了一个很有意思的问题,他抓到一个抓包图,客户端和服务端四次挥手后,客户端在 17 秒内又复用了与上一次连接相同的端口,向服务端发起了 SYN 报文, 并成功建立了连接。他觉得服务端应该还是处于 TIME_WAIT 状态(因为 Linux 操作系统中,2MSL 的时间是 60 秒,也就是 TIME_WAIT 状态的持续时间),为什么收到客户端的 SYN 报文后可以正常建立连接?抓包图手机端不好看,为了方便大家看,我画了一个图:简单来说,这个问题就是,为什么处

2022-04-22 16:27:27 4396 1

原创 1.5 万字 + 40 张图解 HTTP 常见面试题(值得收藏)

大家好,我是小林,我最开始写的第一篇图解文章就是这篇:那时候我也就不到 100 读者,如今这篇阅读都快 2 万了。当时这篇有些地方没有解释到位,然后我周末抽时间把一些没解释清楚的地方重写了,而且还增加 HTTP 缓存技术 方面的面试题,文章的内容相比以前多了 5000 +字和 10 +张图。不多说了,发车发车!HTTP 基本概念HTTP 是什么?HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。能否详细解释「超文本传输协议」?HTTP的名字「超文

2022-04-11 11:38:41 6739 5

原创 malloc 是如何分配内存的?

大家好,我是小林。很早之前写了一篇图解虚拟内存的文章:真棒!20 张图揭开内存管理的迷雾,瞬间豁然开朗最近想多写一些内存管理的文章,这次我们就以 malloc 动态内存分配为切入点,我在文中也做了小实验:malloc 是如何分配内存的?malloc 分配的是物理内存吗?malloc(1) 会分配多大的内存?free 释放内存,会归还给操作系统吗?free() 函数只传入一个内存地址,为什么能知道要释放多大的内存?发车!Linux 进程的内存分布长什么样?在 Linux 操作系统中,

2022-04-07 09:29:57 12022 30

原创 什么是MySQL 事务与 MVCC 原理?

作者:小林coding图解计算机基础网站:https://xiaolincoding.com/大家好,我是小林。之前写过一篇 MySQL 的 MVCC 的工作原理,最近有读者在网站上学习的时候,评论区指出了一些问题。而这个知识点很重要,面试太常问了,所以,我就重写了这篇文章!开车!正文这是我的钱包,共有 100 万元。今天我心情好,我决定给你的转账 100 万,最后的结果肯定是我的余额变为 0 元,你的余额多了 100 万元,是不是想到就很开心?转账这一动作在程序里会涉及到一系列的..

2022-04-01 10:34:16 3943 5

原创 趣说 | 数据库和缓存如何保证一致性?

数据库和缓存如何保证一致性?一天,老板说「最近公司的用户越来越多了,但是服务器的访问速度越来越差的,阿旺帮我优化下,做好了给你画个饼!」。程序员阿旺听到老板口中的「画饼」后就非常期待,没有任何犹豫就接下了老板给的这个任务。阿旺登陆到了服务器,经过一番排查后,确认服务器的性能瓶颈是在数据库。这好办,给服务器加上 Redis,让其作为数据库的缓存。这样,在客户端请求数据时,如果能在缓存中命中数据,那就查询缓存,不用在去查询数据库,从而减轻数据库的压力,提高服务器的性能。先更新数据库,还是先更新缓存

2022-03-31 11:01:06 3676 2

原创 MySQL 的 Buffer Pool,终于被我搞懂了

大家好,我是小林。今天就聊 MySQL 的 Buffer Pool,发车!为什么要有 Buffer Pool?虽然说 MySQL 的数据是存储在磁盘里的,但是也不能每次都从磁盘里面读取数据,这样性能是极差的。要想提升查询性能,加个缓存就行了嘛。所以,当数据从磁盘中取出后,缓存内存中,下次查询同样的数据的时候,直接从内存中读取。为此,Innodb 存储引擎设计了一个缓冲池(Buffer Pool),来提高数据库的读写性能。有了缓冲池后:当读取数据时,如果数据存在于 Buffer Pool

2022-03-25 22:38:54 6859 2

原创 什么是缓存雪崩、击穿、穿透?

什么是缓存雪崩、击穿、穿透?用户的数据一般都是存储于数据库,数据库的数据是落在磁盘上的,磁盘的读写速度可以说是计算机里最慢的硬件了。当用户的请求,都访问数据库的话,请求数量一上来,数据库很容易就奔溃的了,所以为了避免用户直接访问数据库,会用 Redis 作为缓存层。因为 Redis 是内存数据库,我们可以将数据库的数据缓存在 Redis 里,相当于数据缓存在内存,内存的读写速度比硬盘快好几个数量级,这样大大提高了系统性能。引入了缓存层,就会有缓存异常的三个问题,分别是缓存雪崩、缓存击穿、缓存穿透。

2022-03-13 17:55:28 42668 13

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除