【哔哩哔哩】服务端开发暑期实习一面面经|讲解|0508
今天挑选一篇【哔哩哔哩面经】,给大家做讲解分析~
感谢这位同学的分享,预祝Offer多多~~~ 原贴链接
本文也是 《热门面经讲解》 专栏系列文章之一,大家可以点跳转链接,加个关注和订阅,我会持续更新~
自产《大厂后端Top100面试题讲解》对本篇面经题目覆盖率:
6/7 = 85%
自产《大厂后端Top200面试题讲解》对本篇面经题目覆盖率:
7/7 = 100%
讲解开始~~~~~
1.解释一下进程线程协程,为什么线程上下文切换比进程小,进程线程操作系统调度,那协程谁来调度?
解析
高频考题:属于高频考题:
自产《大厂后端Top100面试题讲解|第50和51题》
所属专项:操作系统|进程管理
专项考察占比:
【操作系统】面试中考察操作系统的比率:大厂:12%| 腾讯:18%| 阿里:8%
【操作系统-网络系统】面试考察操作系统时,问“进程管理”相关问题的比率:32%
参考口述回答
- 进程,线程,协程的区别
首先,我们来谈谈进程。进程是操作系统中进行资源分配和调度的基本单位,它拥有自己的独立内存空间和系统资源。每个进程都有独立的堆和栈,不与其他进程共享。进程间通信需要通过特定的机制,如管道、消息队列、信号量等。由于进程拥有独立的内存空间,因此其稳定性和安全性相对较高,但同时上下文切换的开销也较大,因为需要保存和恢复整个进程的状态。
接下来是线程。线程是进程内的一个执行单元,也是CPU调度和分派的基本单位。与进程不同,线程共享进程的内存空间,包括堆和全局变量。线程之间通信更加高效,因为它们可以直接读写共享内存。线程的上下文切换开销较小,因为只需要保存和恢复线程的上下文,而不是整个进程的状态。然而,由于多个线程共享内存空间,因此存在数据竞争和线程安全的问题,需要通过同步和互斥机制来解决。
最后是协程。协程是一种用户态的轻量级线程,其调度完全由用户程序控制,而不需要内核的参与。协程拥有自己的寄存器上下文和栈,但与其他协程共享堆内存。协程的切换开销非常小,因为只需要保存和恢复协程的上下文,而无需进行内核级的上下文切换。这使得协程在处理大量并发任务时具有非常高的效率。然而,协程需要程序员显式地进行调度和管理,相对于线程和进程来说,其编程模型更为复杂。
- 进程上下文切换和线程上下文切换?
首先是进程上下文切换。在切换内容方面,进程上下文切换涉及的内容较为广泛。由于进程是操作系统中进行资源分配和调度的基本单位,它拥有自己的独立内存空间和系统资源,因此进程上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源。这些资源在切换时都需要被保存和恢复,以确保新进程能够在切换后顺利执行。
在发生场景上,进程上下文切换主要发生在以下几种情况:一是进程主动调用某些系统调用时,如等待IO完成或者获取锁,这时进程无法继续运行,操作系统会触发上下文切换;二是进程分配到的时间片用完,或者有更高优先级的进程需要抢占CPU时,也会发生上下文切换。
接下来是线程上下文切换。在切换内容方面,线程上下文切换主要涉及线程在执行过程中的运行条件和状态,如程序计数器、栈信息、寄存器的值等。由于线程共享进程的内存空间,因此线程上下文切换不需要像进程上下文切换那样涉及大量的内存和资源管理。
线程上下文切换发生场景主要包括:线程主动让出CPU,例如调用了Thread.sleep()或Object.wait()等方法;当一个线程的时间片用完,需要切换到另一个线程继续执行;或者线程因为阻塞或等待某个事件而无法继续执行时,调度器会切换到另一个线程继续执行。
推荐学习资料:
《博客》| 腾讯云开发者社区: #一文读懂什么是进程、线程、协程
《小林Coding》|图解系统:# 进程、线程基础知识
《小林Coding》|图解系统:# 进程的上下文切换
《小林Coding》|图解系统:# 线程的上下文切换
2.io多路复用,边缘触发和水平触发,epoll和select有啥区别?
解析
高频考题:属于高频考题:
自产《大厂后端Top100面试题讲解|第59题》
所属专项:操作系统|网络系统
专项考察占比:
【操作系统】面试中考察操作系统的比率:大厂:12%| 腾讯:18%| 阿里:8%
【操作系统-网络系统】面试考察操作系统时,问“网络系统”相关问题的比率:22%
参考口述回答:
- IO多路复用?
IO多路复用是一种高效的IO处理方式,它允许单个进程或线程同时监视多个文件描述符,如网络连接或文件句柄。当这些描述符中的任何一个就绪时,比如有数据可读或可写,多路复用机制就能够通知应用程序进行相应的读写操作。这种机制的核心优势在于,它可以在不增加额外线程或进程的情况下,处理大量的并发连接,从而显著地提高系统的并发性和响应能力。
常见的IO多路复用技术包括select、poll和epoll等。这些技术各有特点,但核心思想都是通过一个线程来管理多个连接,减少系统资源的消耗,并提高程序运行的效率。
- select,poll,epoll的区别
select是最早的一种I/O多路复用技术。它使用一个fd_set数据结构来表示所有被监视的文件描述符。然而,select有几个明显的缺点。首先,它监视的文件描述符数量有限,默认上限是1024。其次,每次调用select时,都需要将fd_set从用户态拷贝到内核态,并且在内核中需要遍历所有被监视的文件描述符来检查是否有就绪的,这个开销在文件描述符数量很多时会变得非常大。最后,select返回后,还需要再次遍历fd_set来找出哪些文件描述符是就绪的,这进一步增加了处理开销。
poll则是select的一种改进方案。它使用一个pollfd结构来表示被监视的文件描述符及其事件。与select相比,poll没有文件描述符数量的限制,因为它基于链表来存储。然而,poll仍然需要在每次调用时从用户态拷贝所有的pollfd结构到内核态,并在内核中遍历检查每个文件描述符的状态。因此,当文件描述符数量很多时,poll的性能也会下降。
epoll则是Linux特有的I/O多路复用技术,它在很多方面都优于select和poll。首先,epoll只在初始时完成一次文件描述符的注册,避免了每次调用时的拷贝开销。其次,epoll采用回调函数的方式,只有当一个或多个文件描述符就绪时,才会调用回调函数并通知用户空间,这使得epoll在处理大量文件描述符时仍然能保持高效。最后,epoll返回时已经明确指出了哪些文件描述符是就绪的,因此无需再像select和poll那样进行额外的遍历操作。
- epoll的事件触发方式?
epoll的事件触发主要有两种方式。第一种是边缘触发,也就是说,只有当文件描述符的状态从不就绪变为就绪时,epoll才会发出通知。一旦通知过后,除非状态再次发生变化,否则不会再次通知。第二种是水平触发,这种模式下,只要文件描述符处于就绪状态,epoll就会持续发出通知,直到数据处理完毕
推荐学习资料:
《小林Coding》|图解系统:IO多路复用
《小林Coding》|图解系统:Epoll
3.tcp整个流程,closed_wait状态?
解析
属于高频考题:
自产《大厂后端Top100面试题讲解|第82,83,85,86题》
所属专项:计算机网络|TCP&UDP
专项考察占比:
【计算机网络】面试中考察计算机网络的比率:大厂:11%| 腾讯:17%| 阿里:7%
【计算机网络-TCP&UDP】面试考察计网时问TCP&UDP问题的比率:42%
- 建立连接的过程?(三次握手)
TCP三次握手是TCP协议中建立连接的重要过程,它涉及客户端和服务器的状态变化以及发送请求的具体内容。
一开始,客户端和服务端都处于CLOSE状态。当服务端准备好接受连接时,它会进入LISTEN状态,等待客户端的连接请求。
第一次握手时,客户端会初始化一个随机序号,并发送一个SYN请求连接报文给服务端,这个报文中包含了客户端的初始序列号。此时,客户端的状态变为SYN-SENT,等待服务端的确认。
服务端收到SYN请求后,会进行第二次握手。服务端也会随机初始化一个序号,并将客户端的序列号加1作为确认应答报文ACK,同时发送自己的SYN报文。这样,服务端发送的就是一个SYN+ACK的报文,此时服务端的状态变为SYN-RCVD。
客户端收到服务端的SYN+ACK报文后,会进行第三次握手。客户端会再次发送一个ACK报文给服务端,确认服务端的SYN报文,并将服务端的ACK序列号加1。此时,客户端的状态变为ESTABLISHED,表示连接已建立。服务端收到客户端的ACK报文后,状态也变为ESTABLISHED。
这个三次握手的过程确保了客户端和服务端都能准确地知道对方已准备好进行数据传输,是TCP协议中保证数据可靠传输的重要机制。
- 断开连接过程?(四次挥手)
首先,我们要明确TCP连接是全双工的,这意味着数据可以在两个方向上同时传输。因此,当一方想要关闭连接时,它需要通知另一方,并确保双方的数据传输都已完成,然后才能完全关闭连接。这就是四次挥手的主要目的。
第一次挥手是由客户端发起的。当客户端没有更多的数据要发送时,它会发送一个FIN报文段给服务端。这个FIN报文段的作用是告诉服务端:“我已经没有数据要发送了,你可以开始关闭你那边到我这边的连接了”。同时,客户端会进入FIN_WAIT_1状态,等待服务端的确认。
第二次挥手发生在服务端收到FIN报文段后。服务端会发送一个ACK报文段给客户端,作为对FIN报文段的确认。这个ACK报文段的作用是告诉客户端:“我已经收到你的关闭请求了,我这边会准备关闭连接,但是在我发送完所有的数据之前,连接还不会完全关闭”。此时,服务端进入
CLOSE_WAIT
状态,等待所有数据发送完毕。而客户端在收到ACK后,会进入FIN_WAIT_2状态,等待服务端的FIN报文段。第三次挥手发生在服务端发送完所有数据后。此时,服务端会发送一个FIN报文段给客户端,告知客户端它也没有数据要发送了,可以关闭连接了。这个FIN报文段的作用是告诉客户端:“我这边也没有数据要发送了,我们可以关闭连接了”。服务端在发送FIN报文段后,会进入LAST_ACK状态,等待客户端的确认。
第四次挥手是客户端在收到服务端的FIN报文段后发起的。客户端会发送一个ACK报文段给服务端,作为对FIN报文段的确认。这个ACK报文段的作用是告诉服务端:“我已经收到你的关闭请求了,我会关闭连接”。在发送完ACK报文段后,客户端会进入TIME_WAIT状态。这个状态会持续一段时间(通常是2MSL,即数据包在网络中的最大生存时间),以确保关闭请求和确认报文段能够被对方正确接收。如果在这段时间内没有收到对方的重新发送请求,那么客户端会最终关闭连接,进入CLOSED状态。而服务端在收到ACK报文段后,会立即关闭连接,进入CLOSED状态。
这就是TCP四次挥手的全过程。通过这个过程,TCP连接能够在确保双方数据传输完成的前提下安全地关闭。这个过程的每一步都是必要的,以确保数据的完整性和可靠性。
推荐学习资料
《小林 Coding》|图解网络: TCP 三次握手过程是怎样的?
《小林 Coding》|图解网络:TCP 四次挥手过程是怎样的?
4. http协议报文格式,http1.0、1.1、2.0、3.0,cors
解析
属于高频考题:
自产《大厂后端Top100面试题讲解》|第90,97,98,99题
所属专项:计算机网络|HTTP
专项考察占比:
【计算机网络】面试中考察计算机网络的比率:大厂:11%| 腾讯:17%| 阿里:7%
【计算机网络-HTTP】面试考察计网时问HTTP问题的比率:35%
参考口述回答:
- http协议的报文结构?
首先,HTTP请求报文主要由请求行、请求头部和请求体三个部分构成。请求行包含了请求的方法,比如GET或POST,请求的URL路径,以及HTTP协议的版本。紧接着请求行的是请求头部,它由多个键值对组成,每个键值对代表一种信息或设置,比如Host字段标明请求的目标主机,User-Agent字段描述发出请求的用户代理信息,Accept字段则列出客户端能够理解的内容类型。请求头部之后,可能跟随一个请求体,它通常用于POST或PUT请求中,包含客户端提交给服务器的数据。
其次,HTTP响应报文的结构与请求报文相似,由状态行、响应头部和响应体组成。状态行包含HTTP协议版本、状态码以及状态描述信息。比如,状态码200表示请求成功,404则表示资源未找到。响应头部也包含多个键值对,提供有关响应的附加信息,如Content-Type描述响应体的内容类型,Content-Length指明响应体的长度。响应体则包含服务器返回给客户端的实际数据内容,如HTML文件、图片或其他媒体资源。
- HTTP/1.1相对HTTP/1.0做了哪些优化改进?
首先,HTTP/1.1引入了持久连接的概念,也就是所谓的长连接。在HTTP/1.0中,每次请求都需要建立一个新的TCP连接,请求处理完毕后立即断开连接。这种方式在处理包含大量图片、链接等资源时,会导致大量的连接建立和断开操作,造成资源浪费和时间延迟。而HTTP/1.1则允许在同一个TCP连接上连续发送多个请求,从而减少了连接建立和断开的开销,提高了网络资源的利用率。
其次,HTTP/1.1支持请求管道化,这意味着客户端可以同时发送多个请求,而不需要等待前一个请求的响应。这样,服务器就可以按照请求到达的顺序依次进行回应,从而减少了等待时间,提高了整体的响应速度。需要注意的是,虽然请求管道化可以并行发送请求,但服务器仍然需要按照顺序回应。
另外,HTTP/1.1还增加了更多的错误状态码,提供了更详细的错误信息,这有助于开发人员更好地定位问题并进行调试。同时,HTTP/1.1还引入了更多的请求头和响应头,为开发人员提供了更多的控制和灵活性。
最后,值得一提的是,HTTP/1.1还改进了缓存机制,允许服务器发送“Last-Modified”和“ETag”等响应头,以便客户端进行条件性请求,这避免了不必要的资源传输,提高了网络的利用率。
总的来说,HTTP/1.1相对于HTTP/1.0在连接管理、请求管道化、错误处理、缓存机制等方面都做了显著的优化和改进,从而提高了网络应用的性能和效率。
- HTTP/2.0相对HTTP/1.1做了哪些优化改进?
HTTP/2.0在保持与HTTP/1.1的语义兼容性的同时,引入了多项重大改进,显著提升了网络性能。
首先,HTTP/2.0采用了二进制分帧层,这使得客户端和服务器可以将HTTP消息分解为多个互不依赖的帧,并可以乱序发送。这些帧在另一端被重新组合起来,从而实现了低延迟和高吞吐量。
其次,HTTP/2.0引入了多路复用技术,允许同时通过单一的HTTP/2连接发起多重请求-响应消息。这解决了HTTP/1.1中的队头阻塞问题,使得多个数据流可以并行传输,从而更有效地使用TCP连接,提高了网络资源的利用率。
此外,HTTP/2.0还支持头部压缩,通过HPACK算法对请求头进行压缩传输,节省了消息头占用的网络流量,降低了带宽消耗。
最后,HTTP/2.0还引入了服务器推送技术,即服务器可以对一个请求发送多个响应。这种机制使得服务器能够更快地推送资源到客户端,从而提高了页面加载速度。
综上所述,HTTP/2.0通过二进制分帧、多路复用、头部压缩和服务器推送等技术,显著提升了网络性能,降低了网络延迟,为用户提供了更好的网络体验。
- HTTP/3.0相对HTTP/2.0做了哪些优化改进?
首先,HTTP/3.0使用了基于UDP协议的QUIC作为传输层协议,而不是传统的TCP协议。这一改变显著减少了连接建立的延迟,因为QUIC协议在建立连接时无需进行多次握手,从而加速了数据传输的速度。
其次,HTTP/3.0支持真正的多路复用,这意味着在同一连接上可以并行处理多个请求和响应,而不会像HTTP/2那样存在队头阻塞的问题。这大大提高了网络资源的利用率和传输效率。
此外,HTTP/3.0还具备更好的流量控制能力,可以有效防止单一流的资源占用过多带宽,从而保证网络传输的稳定性和公平性。
在安全性方面,HTTP/3.0默认使用TLS 1.3加密,为数据传输提供了更高的安全性。同时,QUIC协议还提供了更好的错误恢复机制,当数据包丢失或损坏时,能够更快速地恢复连接并进行数据传输。
最后,值得一提的是,HTTP/3.0还支持0-RTT连接,即客户端可以在不需要等待服务器响应的情况下直接发送数据给服务器。这种连接方式可以大幅度缩短连接建立时间,但在某些场景下可能存在一定的安全风险,因此在使用时需要谨慎考虑。
总的来说,HTTP/3.0通过采用QUIC协议、支持真正的多路复用、提供更好的流量控制和安全性能等方面的优化和改进,进一步提升了网络传输的效率和性能。这些改进使得HTTP/3.0成为现代网络中更具优势和应用前景的协议。
推荐学习资料:
《博客:JavaScript Guidebook》:HTTP 报文格式
《小林Coding》|图解网络:HTTP/1.1 相比 HTTP/1.0 提高了什么性能?
《小林Coding》|图解网络:HTTP/2 做了什么优化?
《小林Coding》|图解网络:HTTP/3 做了什么优化?
5. websocket升级流程
解析
属于次高频考题:
属于自产《大厂后端Top101-200面试题讲解》
所属专项:计算机网络|HTTP
专项考察占比:
【计算机网络】面试中考察计算机网络的比率:大厂:11%| 腾讯:17%| 阿里:7%
【计算机网络-HTTP】面试考察计网时问HTTP问题的比率:35%
参考口述回答:
WebSocket连接建立的过程:
- 客户端发起连接请求
首先,客户端(如Web浏览器)会向服务器发起一个HTTP请求,意在建立一个WebSocket连接。这个HTTP请求不同于常规的请求,因为它包含了特殊的头信息,用以表明客户端希望将连接从HTTP升级到WebSocket。
- 包含特殊的头信息
在HTTP请求头中,必须包含以下关键信息:
Upgrade: websocket
:这个头部告诉服务器,客户端希望将连接升级到WebSocket协议。Connection: Upgrade
:此头部表示客户端要求服务器升级当前的HTTP连接到WebSocket连接。Sec-WebSocket-Key
:一个由客户端随机生成的密钥,用于服务器在响应中生成对应的Sec-WebSocket-Accept
值,以证明它理解了WebSocket协议。Sec-WebSocket-Version
:支持的WebSocket协议版本,通常是13。可能还包括其他一些可选的头信息,如子协议、扩展等。
- 服务器响应并升级连接
服务器在接收到这个特殊的HTTP请求后,会检查请求头中的信息,确认是否支持并愿意进行连接升级。如果一切正常,服务器会返回一个HTTP响应,状态码为
101 Switching Protocols
,表示服务器同意将连接从HTTP升级到WebSocket。服务器的响应中会包含以下头部信息:
Upgrade: websocket
:确认连接已经升级到WebSocket。
Connection: Upgrade
:表示连接已被升级。
Sec-WebSocket-Accept
:根据客户端提供的Sec-WebSocket-Key
计算得出的值,用于验证服务器的响应。
- 完成握手并建立WebSocket连接
当客户端接收到服务器的
101 Switching Protocols
响应后,WebSocket握手过程就完成了。此时,连接已经从HTTP连接正式升级为WebSocket连接。
- 进行数据传输
一旦WebSocket连接建立成功,客户端和服务器就可以通过这个连接进行双向的、全双工的数据传输了。这意味着客户端和服务器可以同时发送和接收消息。
- 关闭WebSocket连接
当数据传输完成或者任何一方决定关闭连接时,会发送一个WebSocket关闭帧来通知对方关闭连接。这样,WebSocket连接就会被优雅地关闭。
总的来说,WebSocket连接的建立过程是一个从HTTP协议升级到WebSocket协议的过程,它允许客户端和服务器之间进行实时、双向的通信。
推荐学习资料:
《小林Coding》|图解网络:怎么建立WebSocket连接?
6.mvcc? 为什么mysql索引是b+树而不是b树或二叉树
解析
属于高频考题:
自产《大厂后端Top100面试题讲解|第4和10题》
所属专项:MySQL|事务
专项考察占比:
【MySQL】面试中考察MySQL的比率:大厂:18%| 腾讯:13%| 阿里:17%
【MySQL-事务】面试考察MySQL时,问“事务”相关问题的比率:18%
参考口述回答
1.详细介绍下MVCC?
一、MVCC的基本概念
MVCC允许多个事务同时读取同一行数据,而不会彼此阻塞,每个事务看到的数据版本是该事务开始时的数据版本。这意味着,如果其他事务在此期间修改了数据,正在运行的事务仍然看到的是它开始时的数据状态,从而实现了非阻塞读操作。
二、不同隔离级别下的MVCC实现
- 读未提交(Read Uncommitted) :在这个隔离级别下,事务可以读取到其他未提交事务的修改。然而,这通常不被推荐,因为它可能导致脏读。在MVCC的上下文中,这个级别并不会创建数据的多个版本。
- 读已提交(Read Committed) :在这个级别,每次查询都会生成一个新的数据快照。当事务进行读取操作时,它只能看到在该事务开始之前已经被提交的数据。这意味着,如果数据在事务执行过程中被其他事务修改并提交,那么当前事务在下次查询时将看到这些更改。MVCC通过为每个事务提供其开始时的数据版本来实现这一点。
- 可重复读(Repeatable Read) :这是MySQL的默认隔离级别。在这个级别下,事务在开始时创建一个数据快照,并且在整个事务过程中都使用这个快照。即使其他事务在此期间修改了数据并提交,当前事务仍然看到的是它开始时的数据状态。MVCC通过保存数据的多个版本来实现这一点,每个版本都与一个特定的事务相关联。
- 串行化(Serializable) :这是最严格的隔离级别。在这个级别下,事务是完全串行执行的,避免了所有并发问题。然而,这也意味着性能可能受到影响,因为事务必须等待其他事务完成才能继续执行。在MVCC的上下文中,这个级别可能会退化为单版本控制,因为所有事务都是串行执行的。
三、MVCC的工作原理
MVCC的工作原理是基于数据版本的管理。每当数据被修改时,数据库不是直接更新原始数据,而是创建一个新的数据版本。每个版本都与一个事务ID相关联,这个ID表示哪个事务创建了该版本。当事务进行读取操作时,数据库会根据该事务的隔离级别和当前活跃的事务列表来决定哪个版本的数据应该被返回。
此外,MVCC还依赖于一种称为“Read View”的机制来确定哪些版本的数据对当前事务是“可见”的。Read View本质上是一个事务ID的列表,它表示在当前事务开始时尚未提交的其他事务。通过这个列表,数据库可以判断哪些数据版本对当前事务是不可见的(因为它们是由尚未提交的事务创建的)。
2.为什么mysql索引是b+树而不是b树或二叉树
一、树的高度
B+树相较于B树,其树的高度更低。这是因为B+树的非叶子节点不存储数据,只存储索引,因此可以容纳更多的子节点,使得整个树的结构更加扁平化。这种设计减少了查询时需要经过的层级数,最重要是减少了磁盘IO的次数,从而提高了查询效率。相比之下,B树的每个节点都存储数据,导致节点容纳的子节点数量有限,树的高度相对较高。
二、插入删除效率
在插入和删除操作方面,B+树也表现出更高的效率。由于B+树的非叶子节点不存储数据,因此在插入或删除数据时,只需要调整索引结构,而不需要频繁地移动大量数据。这大大简化了插入和删除操作的过程,并提高了效率。相比之下,B树在插入或删除数据时可能需要更复杂的操作来保持树的平衡。
三、范围查询效率
B+树在范围查询方面具有显著优势。由于B+树的叶子节点包含所有数据,并且叶子节点之间通过指针相连,形成了一个有序链表结构。这种结构使得范围查询变得非常简单和高效,因为我们可以直接通过叶子节点的指针顺序访问范围内的数据。而在B树中,范围查询可能需要更复杂的中序遍历操作。
推荐学习资料
《掘金专栏》|全解MySQL数据库:# (九)MySQL之MVCC机制:为什么你改了的数据我还看不见
《掘金专栏》|全解MySQL数据库:# MySQL索引为何使用B+树结构?
7.set底层数据结构
解析
高频考题:属于高频考题:
自产《大厂后端Top100面试题讲解|第66题》
所属专项:Redis|数据类型
专项考察占比:
【Redis】面试中考察操作系统的比率:大厂:12%| 腾讯:7%| 阿里:13%
【Redis-数据类型】面试考察Redis时,问“数据类型”相关问题的比率:20%
参考口述回答
Set类型的底层实现主要是基于哈希表。Redis将每个元素作为哈希表的一个键,并将其值设置为NULL。由于哈希表的键具有唯一性,所以Set类型中的元素也是唯一的。这种实现方式保证了Set的高效性和唯一性。(注意:如果集合中的元素都是整数且元素个数小于 512 个,Redis 会使用整数集合作为底层数据结构)
推荐学习资料
《小林Coding》|图解Redis:Redis 常见数据类型底层实现
本文也是 《热门面经讲解》 专栏系列文章之一,大家可以点跳转链接,点个关注和订阅,我会持续更新~
#面经##实习##哔哩哔哩##24届软开秋招面试经验大赏##牛客在线求职答疑中心#挑选近期热门真实后端面经进行讲解分析,给出:个人分析+参考回答+学习资料指引。