你的位置:开云(中国)kaiyun体育网址-登录入口 > 新闻 > 开云体育音问部队、散布式锁等场景-开云(中国)kaiyun体育网址-登录入口

开云体育音问部队、散布式锁等场景-开云(中国)kaiyun体育网址-登录入口

时间:2025-09-12 08:22 点击:180 次

开云体育音问部队、散布式锁等场景-开云(中国)kaiyun体育网址-登录入口

图解学习网站:

公共好,我是小林。

腾讯云智属于腾讯的子公司,谨防的业务大部分是腾讯云联系的,有在腾讯csig的一又友跟我聊过,他和腾讯云智的共事亦然时常打交谈的。

天然腾讯云智被大无数东谈主称为大厂内包,然而大厂内包责任阅历的求职影响其实莫得像外包公司那么大,反而照旧挺平方的阅历,以致可能比一些中微型公司更好一些。

为什么这样说呢?因为干的活等于大厂的样子,责任的挑战性和成长性这些会比中微型公司更强。

腾讯云智公司主要在二线城市,总部是西安,然后长沙、武汉齐有办公所在,左证本年腾讯云智校招薪资开奖信息来看的话,迷惑岗亭的普通档 offer 举座年包在 22~24w,sp offer 年包在 26w~27w,在二线城市的话,还算可以的。

之前有磨练营同学拿到腾讯云智的实习offer,拿到了之后,就聘请径直去了,再也不想口试了。

伸开剩余95%

因为在拿到腾讯云智offer之前,他口试的进程相配险峻,他在最首先也有拿到许多中大厂公司的口试契机,比如腾讯、字节等等,不外由于准备的比较仓促,再加上非科班,天然八股齐背的差未几了,然而照旧一个个点,莫得把学问串起来,而且口试的时候,也没什么我方念念考的进程,遭遇没背过的,就嗅觉脑子顿住了。

是以刚首先出去找实习这几个月,基本齐挂了,挂了不可怕,可怕不去校正和反念念,经过前边的失败翻盘和校正之后,才班师斩获了腾讯云智offer。

腾讯云智实习天然不如一线大厂,然而淌若一线大厂契机比较少,亦然可以尝试冲大厂子公司,前年也有同学跟我反馈,他实习去了腾讯云智,然而秋招照旧拿到了大厂offer,他以为腾讯云智的实习,学到了蛮多的公司,大厂口试官齐挺感兴致的,唯有引起口试官感兴致去发问和你交流,那么这段阅历等于加分的。

那此次咱们就来望望腾讯云智口试难度怎样?

举座我嗅觉口试格调挺肖似腾讯,心爱问盘算推算机基础多一些,然后每个常用的后端组件拷打几个问题,亦然雷同有手撕算法门径,是以想冲腾讯云智的同学,算法照旧得多刷刷。

腾讯云智(一面)ConcurrentHashMap怎样保证线程安全的?

JDK 1.7 ConcurrentHashMap

JDK 1.7 ConcurrentHashMap

在 JDK 1.7 中它使用的是数组加链表的步地达成的,而数组又分为:大数组 Segment 和一丝组 HashEntry。 Segment 是一种可重入锁(ReentrantLock),在 ConcurrentHashMap 里上演锁的扮装;HashEntry 则用于存储键值对数据。一个 ConcurrentHashMap 里包含一个 Segment 数组,一个 Segment 里包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素。

JDK 1.7 ConcurrentHashMap 分段锁本事将数据分红一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁拜谒其中一个段数据的时候,其他段的数据也能被其他线程拜谒,大概达成果然的并发拜谒。

JDK 1.8 ConcurrentHashMap

JDK 1.8 ConcurrentHashMap

在 JDK 1.7 中,ConcurrentHashMap 天然是线程安全的,但因为它的底层达成是数组 + 链表的步地,是以在数据比较多的情况下拜谒是很慢的,因为要遍历通盘链表,而 JDK 1.8 则使用了数组 + 链表/红黑树的方式优化了 ConcurrentHashMap 的达成,具体达成结构如下:

JDK 1.8 ConcurrentHashMap JDK 1.8 ConcurrentHashMap 主要通过 volatile + CAS 或者 synchronized 来达成的线程安全的。添加元素时领先会判断容器是否为空:

淌若为空则使用 volatile 加 CAS 来开动化

淌若容器不为空,则左证存储的元素盘算推算该位置是否为空。

淌若左证存储的元素盘算推算终结为空,则诈欺 CAS 确立该节点;

淌若左证存储的元素盘算推算终结不为空,则使用 synchronized ,然后,遍历桶中的数据,并替换或新增节点到桶中,终末再判断是否需要转为红黑树,这样就能保证并发拜谒时的线程安全了。

淌若为空则使用 volatile 加 CAS 来开动化

淌若容器不为空,则左证存储的元素盘算推算该位置是否为空。

淌若左证存储的元素盘算推算终结为空,则诈欺 CAS 确立该节点;

淌若左证存储的元素盘算推算终结不为空,则使用 synchronized ,然后,遍历桶中的数据,并替换或新增节点到桶中,终末再判断是否需要转为红黑树,这样就能保证并发拜谒时的线程安全了。

淌若左证存储的元素盘算推算终结为空,则诈欺 CAS 确立该节点;

淌若左证存储的元素盘算推算终结不为空,则使用 synchronized ,然后,遍历桶中的数据,并替换或新增节点到桶中,终末再判断是否需要转为红黑树,这样就能保证并发拜谒时的线程安全了。

淌若把上头的引申用一句话归纳的话,就止境于是ConcurrentHashMap通过雠敌结点加锁来保证线程安全的,锁的粒度比较 Segment 来说更小了,发生突破和加锁的频率缩短了,并发操作的性能就提高了。

而且 JDK 1.8 使用的是红黑树优化了之前的固定链表,那么当数据量比较大的时候,查询性能也得到了很大的进步,从之前的 O(n) 优化到了 O(logn) 的时刻复杂度。

Redis可以处分什么问题?

Redis 是一种基于内存的数据库,对数据的读写操作齐是在内存中完成,因此读写速率相配快,常用于缓存,音问部队、散布式锁等场景。

缓存: Redis最常见的用途等于当作缓存系统。通过将热点数据存储在内存中,可以极地面提高拜谒速率,削弱数据库负载,这关于需要快速反馈时刻的应用标准相配蹙迫。

名次榜: Redis的有序麇谄谀构相配合适用于达成名次榜和排名系统,可以浅薄地进行数据排序和排名。

散布式锁: Redis的特色可以用来达成散布式锁,确保多个进度或工作之间的数据操作的原子性和一致性。

计数器由于Redis的原子操作和高性能,它相配合适用于达成计数器和统计数据的存储,如网站拜谒量统计、点赞数统计等。

缓存: Redis最常见的用途等于当作缓存系统。通过将热点数据存储在内存中,可以极地面提高拜谒速率,削弱数据库负载,这关于需要快速反馈时刻的应用标准相配蹙迫。

名次榜: Redis的有序麇谄谀构相配合适用于达成名次榜和排名系统,可以浅薄地进行数据排序和排名。

散布式锁: Redis的特色可以用来达成散布式锁,确保多个进度或工作之间的数据操作的原子性和一致性。

计数器由于Redis的原子操作和高性能,它相配合适用于达成计数器和统计数据的存储,如网站拜谒量统计、点赞数统计等。

臆造内存是操作系统提供给每个运行中标准的一种地址空间,每个标准在运行时认为我方领有的内存空间等于臆造内存,其大小可以远广大于物理内存的大小。臆造内存通过将标准的地址空间分别红若干个固定大小的页或段,并将这些页或者段映射到物理内存中的不同位置,从而使得标准在运行时可以更高效地诈欺物理内存。

淌若操作系统不维持臆造内存,标准的运即将受到物理内存的径直终结,可能激励以下中枢问题:

物理内存不及:当代标准(如大型游戏、臆造机、数据库)无为需要数 GB 的内存。若物理内存较小(如早期盘算推算机的 MB 级内存),标准无法加载一起数据和代码,导致无法启动或频繁崩溃。

内存碎屑化:物理内存被多个标准分割为不一语气的块,即使总容量满盈,也可能因无法找到一语气的大内存块而无法加载新标准。举例,物理内存剩余 1GB 但被拆分为多个小碎屑,此时需要 800MB 一语气内存的标准将无法运行。

地址越界拜谒:莫得臆造内存的地址映射机制,标准径直操作物理内存,可能误读或修改其他标准的内存数据,导致标准崩溃或数据流露。举例,一个标准的指针失实可能粉饰系统内核或其他标准的要津数据。

坏心舛错风险:标准可径直拜谒大肆物理内存地址,坏心软件易通过内存改换破碎系统或窃取信息。

物理内存不及:当代标准(如大型游戏、臆造机、数据库)无为需要数 GB 的内存。若物理内存较小(如早期盘算推算机的 MB 级内存),标准无法加载一起数据和代码,导致无法启动或频繁崩溃。

内存碎屑化:物理内存被多个标准分割为不一语气的块,即使总容量满盈,也可能因无法找到一语气的大内存块而无法加载新标准。举例,物理内存剩余 1GB 但被拆分为多个小碎屑,此时需要 800MB 一语气内存的标准将无法运行。

地址越界拜谒:莫得臆造内存的地址映射机制,标准径直操作物理内存,可能误读或修改其他标准的内存数据,导致标准崩溃或数据流露。举例,一个标准的指针失实可能粉饰系统内核或其他标准的要津数据。

坏心舛错风险:标准可径直拜谒大肆物理内存地址,坏心软件易通过内存改换破碎系统或窃取信息。

多进度和多线程的区别:

多进度需通过 IPC(进度间通讯)机制(如管谈、Socket、分享内存)传递数据,通讯复杂度高但安全性强。多线程可径直拜谒分享变量,通讯粗陋但需处理线程安全(如加锁、原子操作),易激励竞态条目。

多进度的进度间实足隔断,一个进度崩溃不影响其他进度,而多线程的线程间分享资源,一个线程崩溃可能导致通盘进度崩溃。

多进度的进度创建 / 切换支出大(需分派内存、复制页表等),多线程的线程创建 / 切换支出小(仅需保存寄存器气象)。

多进度需通过 IPC(进度间通讯)机制(如管谈、Socket、分享内存)传递数据,通讯复杂度高但安全性强。多线程可径直拜谒分享变量,通讯粗陋但需处理线程安全(如加锁、原子操作),易激励竞态条目。

多进度的进度间实足隔断,一个进度崩溃不影响其他进度,而多线程的线程间分享资源,一个线程崩溃可能导致通盘进度崩溃。

多进度的进度创建 / 切换支出大(需分派内存、复制页表等),多线程的线程创建 / 切换支出小(仅需保存寄存器气象)。

怎样聘请?

当任务 IO 密集、需频繁分享数据,或追求轻量级并发时,可以优先聘请多线程。

当任务 CPU 密集、需强隔断性,或跨平台 / 话语集成时,可以优先聘请多进度。

当任务 IO 密集、需频繁分享数据,或追求轻量级并发时,可以优先聘请多线程。

当任务 CPU 密集、需强隔断性,或跨平台 / 话语集成时,可以优先聘请多进度。

维度POSTPUT 幂等性非幂等:屡次筹商肯求可能产生不同终结幂等:屡次筹商肯求终结筹商(粉饰或创建) 资源操作无为用于创建新资源(如注册用户)无为用于更新已有资源(如修改用户信息) 资源记号客户端不指定资源 ID,由工作器生成(如/users)客户端需指定资源 ID(如/users/123) 数据处理提交的数据当作肯求的 “从属品”(如表单)提交的数据是资源的齐全显露(粉饰原内容)

Post和Get的区别是什么?

左证 RFC 标准,GET 的语义是从工作器赢得指定的资源,这个资源可以是静态的文本、页面、图片视频等。GET 肯求的参数位置一般是写在 URL 中,URL 端正只可维持 ASCII,是以 GET 肯求的参数只允许 ASCII 字符 ,而且浏览器会对 URL 的长度有终结(HTTP合同自己对 URL长度并莫得作念任何端正)。

比如,你怒放我的著作,浏览器就会发送 GET 肯求给工作器,工作器就会复返著作的总共笔墨及资源。

左证 RFC 标准,POST 的语义是左证肯求负荷(报文body)对指定的资源作念出处理,具体的处理方式视资源类型而不同。POST 肯求捎带数据的位置一般是写在报文 body 中,body 中的数据可以是大肆步地的数据,唯有客户端与工作端协商好即可,而且浏览器不会对 body 大小作念终结。

比如,你在我著作底部,敲入了留言后点击「提交」(示意你们留言),浏览器就会引申一次 POST 肯求,把你的留言笔墨放进了报文 body 里,然后拼接好 POST 肯求头,通过 TCP 合同发送给工作器。

淌若从 RFC 标准界说的语义来看:

GET 措施等于安全且幂等的,因为它是「只读」操作,不管操作若干次,工作器上的数据齐是安全的,且每次的终结齐是筹商的。是以,可以对 GET 肯求的数据作念缓存,这个缓存可以作念到浏览器自己上(透顶幸免浏览器发肯求),也可以作念到代理上(如nginx),而且在浏览器中 GET 肯求可以保存为书签。

POST因为是「新增或提交数据」的操作,会修改工作器上的资源,是以是不安全的,且屡次提交数据就会创建多个资源,是以不是幂等的。是以,浏览器一般不会缓存 POST 肯求,也不成把 POST 肯求保存为书签。

GET 措施等于安全且幂等的,因为它是「只读」操作,不管操作若干次,工作器上的数据齐是安全的,且每次的终结齐是筹商的。是以,可以对 GET 肯求的数据作念缓存,这个缓存可以作念到浏览器自己上(透顶幸免浏览器发肯求),也可以作念到代理上(如nginx),而且在浏览器中 GET 肯求可以保存为书签。

POST因为是「新增或提交数据」的操作,会修改工作器上的资源,是以是不安全的,且屡次提交数据就会创建多个资源,是以不是幂等的。是以,浏览器一般不会缓存 POST 肯求,也不成把 POST 肯求保存为书签。

然而骨子进程中,迷惑者不一定会按照 RFC 标准界说的语义来达成 GET 和 POST 措施。比如:

可以用 GET 措施达成新增或删除数据的肯求,这样达成的 GET 措施天然就不是安全和幂等。

可以用 POST 措施达成查询数据的肯求,这样达成的 POST 措施天然等于安全和幂等。

可以用 GET 措施达成新增或删除数据的肯求,这样达成的 GET 措施天然就不是安全和幂等。

可以用 POST 措施达成查询数据的肯求,这样达成的 POST 措施天然等于安全和幂等。

客户端和工作端齐可以发起四次挥手的进程,下图是客户端主动关闭流通的进程:

具体进程:

客户端主动调用关闭流通的函数,于是就会发送 FIN 报文,这个 FIN 报文代表客户端不会再发送数据了,参加 FIN_WAIT_1 气象;

工作端收到了 FIN 报文,然后随即修起一个 ACK 阐发报文,此时工作端参加 CLOSE_WAIT 气象。在收到 FIN 报文的时候,TCP 合同栈会为 FIN 包插入一个文献终结符 EOF 到袭取缓冲区中,工作端应用标准可以通过 read 调用来感知这个 FIN 包,这个 EOF 会被放在已列队等候的其他已袭取的数据之后,是以必须要得赓续 read 袭取缓冲区已袭取的数据;

接着,当工作端在 read 数据的时候,终末天然就会读到 EOF,接着read 就会复返 0,这时工作端应用标准淌若少见据要发送的话,就发完数据后能力用关闭流通的函数,淌若工作端应用标准没少见据要发送的话,可以径直调用关闭流通的函数,这时工作端就会发一个 FIN 包,这个 FIN 报文代表工作端不会再发送数据了,之后处于 LAST_ACK 气象;

客户端袭取到工作端的 FIN 包,并发送 ACK 阐发包给工作端,此时客户端将参加 TIME_WAIT 气象;

工作端收到 ACK 阐发包后,就参加了终末的 CLOSE 气象;

客户端经过 2MSL 时刻之后,也参加 CLOSE 气象;

客户端主动调用关闭流通的函数,于是就会发送 FIN 报文,这个 FIN 报文代表客户端不会再发送数据了,参加 FIN_WAIT_1 气象;

工作端收到了 FIN 报文,然后随即修起一个 ACK 阐发报文,此时工作端参加 CLOSE_WAIT 气象。在收到 FIN 报文的时候,TCP 合同栈会为 FIN 包插入一个文献终结符 EOF 到袭取缓冲区中,工作端应用标准可以通过 read 调用来感知这个 FIN 包,这个 EOF 会被放在已列队等候的其他已袭取的数据之后,是以必须要得赓续 read 袭取缓冲区已袭取的数据;

接着,当工作端在 read 数据的时候,终末天然就会读到 EOF,接着read 就会复返 0,这时工作端应用标准淌若少见据要发送的话,就发完数据后能力用关闭流通的函数,淌若工作端应用标准没少见据要发送的话,可以径直调用关闭流通的函数,这时工作端就会发一个 FIN 包,这个 FIN 报文代表工作端不会再发送数据了,之后处于 LAST_ACK 气象;

客户端袭取到工作端的 FIN 包,并发送 ACK 阐发包给工作端,此时客户端将参加 TIME_WAIT 气象;

工作端收到 ACK 阐发包后,就参加了终末的 CLOSE 气象;

客户端经过 2MSL 时刻之后,也参加 CLOSE 气象;

为什么需要三次抓手?

若客户端发送的第一个 SYN 包因收集延长淹留,后续再行发送 SYN 栽种流通。此时若工作器仅用两次抓手(SYN+ACK),当淹留的旧 SYN 包到达工作器时,会被误认为是新肯求,导致工作器创建无效流通(诬害资源)。三次抓手时,客户端收到旧 SYN 对应的 SYN+ACK 后,会因 seq 不符而隔断,幸免无效流通。

三次抓手确保两边的发送和袭取智力均被考据,幸免单标的通讯很是(如客户端能发但工作器袭取端口很是)。

若客户端发送的第一个 SYN 包因收集延长淹留,后续再行发送 SYN 栽种流通。此时若工作器仅用两次抓手(SYN+ACK),当淹留的旧 SYN 包到达工作器时,会被误认为是新肯求,导致工作器创建无效流通(诬害资源)。三次抓手时,客户端收到旧 SYN 对应的 SYN+ACK 后,会因 seq 不符而隔断,幸免无效流通。

三次抓手确保两边的发送和袭取智力均被考据,幸免单标的通讯很是(如客户端能发但工作器袭取端口很是)。

为什么挥手需要四次?

当客户端发送 FIN 包肯求断开时,仅显露客户端不再发送新数据,但仍可能袭取工作器未传输完的数据(如工作器正在传输文献)。此时工作器需先修起 ACK 阐发收到 FIN,待自身数据发送完了后,再发送 FIN 包肯求断开,酿成四次挥手。

若将挥手书化为两次(客户端 FIN→工作器 FIN+ACK),可能出现以下问题:工作器若有未发送完的数据,在修起 FIN+ACK 后会被动关闭发送通谈,导致数据丢失。客户端收到 FIN+ACK 后立即关闭流通,无法袭取工作器后续的数据。

当客户端发送 FIN 包肯求断开时,仅显露客户端不再发送新数据,但仍可能袭取工作器未传输完的数据(如工作器正在传输文献)。此时工作器需先修起 ACK 阐发收到 FIN,待自身数据发送完了后,再发送 FIN 包肯求断开,酿成四次挥手。

若将挥手书化为两次(客户端 FIN→工作器 FIN+ACK),可能出现以下问题:工作器若有未发送完的数据,在修起 FIN+ACK 后会被动关闭发送通谈,导致数据丢失。客户端收到 FIN+ACK 后立即关闭流通,无法袭取工作器后续的数据。

低,这个查询方式是全表扫描的方式,因为左爽朗匹配的话,会导致索引失效,查询的时候无法诈欺索引。

MySQL的索引的数据结构是什么?红黑树和B+树后果上下?

MySQL InnoDB 引擎是用了B+树当作了索引的数据结构。

B+Tree 是一种多叉树,叶子节点才存放数据,非叶子节点只存放索引,而且每个节点里的数据是按主键法令存放的。每一层父节点的索引值齐会出现时基层子节点的索引值中,因此在叶子节点中,包括了总共的索引值信息,而且每一个叶子节点齐有两个指针,分别指向下一个叶子节点和上一个叶子节点,酿成一个双向链表。

主键索引的 B+Tree 如图所示:

关于有 N 个叶子节点的 B+Tree,其搜索复杂度为O(logdN),其中 d 显露节点允许的最大子节点个数为 d 个。在骨子的应用当中, d 值是大于100的开云体育,这样就保证了,即使数据达到千万级别时,B+Tree 的高度照旧看守在 3~4 层独揽,也等于说一次数据查询操作只需要作念 3~4 次的磁盘 I/O 操作就能查询到目的数据。

发布于:广东省
服务热线
官方网站:www.hazahoikuen.com
工作时间:周一至周六(09:00-18:00)
联系我们
QQ:20679404455
邮箱:eb165ad2@outlook.com
地址:新闻科技园5663号
关注公众号

Powered by 开云(中国)kaiyun体育网址-登录入口 RSS地图 HTML地图


开云(中国)kaiyun体育网址-登录入口-开云体育音问部队、散布式锁等场景-开云(中国)kaiyun体育网址-登录入口

回到顶部