字节后端实习一面凉经之解答
原帖:https://www.nowcoder.com/feed/main/detail/bc32e9d012e5449e911cb5cd40b720fa
1、脏读、不可重复读、幻读是怎么产生的
脏读就是,比如两个事务都在操作同一个表,A事务修改了C字段的值没有提交该事务;而B事务也在读取C字段的值,就在这时A事务发生了失败回滚,那么C字段的值返回原来的值,所以B事务发生了脏读。整个过程结束,数据库没有发生任何改变,B事务却读到了奇怪的值,这就是脏读。解决办法是行级共享锁。
不可重复读就是,比如两个事务都在操作同一个表,A事务先读取了C字段的值后继续操作下一个字段;而B事务在这个时候修改了C字段的值。A事务再读取C字段的值,发现同一个事务下,竟然前后两次读取不一样,这就很怪异了,这就是不可重复读。解决办法是对事务进行加锁。
幻读就是,比如两个事务都在操作同一个表,A事务先读取了表的行数;而B事务在这个时候为表格新插入了一行数据。A事务再读取表的行数,发现竟多了一行,这就很怪异了,这就是幻读。解决办法是对表进行加锁。
2、数据数索引数据结构
哈希表、红黑树、B树、B+树
3、为什么不用哈希表
哈希表的优点是查询和更新的速度非常快,时间复杂度为O(1),即常数时间。但是,哈希表的缺点是需要额外的存储空间来存储数组,而且当键的数量过多时,哈希函数可能会出现冲突,导致多个键映射到同一个索引上,影响查询和更新的速度。因此,在使用哈希表时需要考虑哈希函数的设计,以及如何解决哈希冲突的问题。
4、除开区间查找B+树还有什么优势
- B+树只有叶子节点存储数据(B+数中有两个头指针:一个指向根节点,另一个指向关键字最小的叶节点),叶子节点包含了这棵树的所有数据,所有的叶子结点使用链表相连,便于区间查找和遍历,所有非叶节点起到索引作用。
- B+树中查找,无论查找是否成功,每次都是一条从根节点到叶节点的路径,查找时间复杂度稳定。
- B+树的叶子节点通过链表相连,所以B+树范围查找比B树效率高。 B树和B+树的共同优点 考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是b树和B+树的特征之一,m的大小取决于磁盘页的大小。
5、跳表
跳表(Skip List)是一种基于并联的、随机化的数据结构,可以用来实现有序的数据集合。它的基本思想是在链表的基础上,增加多级索引,从而提高数据的查找效率。在一般情况下,它的查找、插入、删除等操作的时间复杂度都为O(log n)。
跳表的核心是索引,它通过维护多级有序链表来实现。每一级索引是原始链表的一部分节点组成,每一级索引的元素数量都比它下一级索引的元素数量少一半。最上面一级索引只有两个节点,第二级索引有四个节点,以此类推。通过这种方式,跳表在空间复杂度和时间复杂度之间做到了平衡。
跳表的查找过程与二分查找类似,先在最高级的索引中查找目标节点,然后通过下降到更低一级的索引再次查找,直到在最底层的索引中找到目标节点或者查找到整个跳表中都没有这个节点。由于跳表的结构不依赖于节点的分布情况,所以它可以用来代替平衡树,实现更高效的查找操作。
6、http tcp ip 分别在哪一层
具体来说,它们在OSI七层模型和TCP/IP四层模型中的位置如下:
- OSI七层模型:HTTP:应用层(第七层)TCP:传输层(第四层)IP:网络层(第三层)
- TCP/IP四层模型:HTTP:应用层TCP:传输层IP:网络层
7、tcp首部字段有哪些
TCP 首部字段主要包括以下几个部分:
- 源端口(Source Port):占用 2 字节,表示源端口号;
- 目的端口(Destination Port):占用 2 字节,表示目的端口号;
- 序列号(Sequence Number):占用 4 字节,表示报文段中第一个字节的序列号;
- 确认号(Acknowledgment Number):占用 4 字节,只有 ACK 标志位为 1 时才有效,表示接收到的序列号为 ack_num -1 的数据;
- 首部长度(Header Length):占用 4 比特,表示首部长度,用于指示接收端首部的长度,以便在紧接着首部后的数据中定位有效数据的起始位置;
- 保留(Reserved):占用 3 比特,保留为今后使用,目前必须设置为 0;
- 标志位(Flags):占用 9 比特,包含以下 9 个标志位:URG(Urgent):紧急指针(urgent pointer)是否有效;ACK(Acknowledgement):确认序号是否有效;PSH(Push):是否尽快将数据推送给应用层;RST(Reset):重置连接;SYN(Synchronize):同步序号,用于建立连接;FIN(Finish):结束连接;Reserved(Reserved):保留;NS(Nonce Sum):ECN 的 nonce 信息;
- 窗口大小(Window Size):占用 2 字节,表示接收端可以接收的数据量;
- 校验和(Checksum):占用 2 字节,用于检测首部和数据的传输是否有误;
- 紧急指针(Urgent Pointer):占用 2 字节,只有 URG 标志位为 1 时才有效,表示紧急数据的位置;
- 选项(Options):可选,占用 0 到 40 字节,用于在首部中添加一些选项信息。
8、进程跟线程的区别
进程(Process)和线程(Thread)是操作系统中的概念,是计算机中的基本执行单位。它们的主要区别如下:
- 进程是资源分配的最小单位,线程是程序执行的最小单位;
- 每个进程都有独立的内存空间,而线程共享所属进程的内存空间;
- 进程间通信需要使用进程间通信的机制,如管道、消息队列等,而线程可以直接访问所属进程的共享内存空间;
- 进程的创建和销毁都需要操作系统的介入,而线程的创建和销毁可以由所属进程自己控制;
- 进程上下文切换需要保存和恢复进程的所有状态,而线程的上下文切换只需要保存和恢复部分状态。
9、线程有自己的哪些东西
每个线程拥有自己的栈段和寄存器组。
10、追问栈里有什么
我理解栈里存的是局部变量
11、Redis两种持久化的比较
Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化。Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上。redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)。
RDB是定期将数据写入磁盘,当redis出现故障时,有一部分内存数据肯定会丢失。而AOF是以日志的方式追加,数据丢失会少很多。对于同一份数据来说,AOF 日志文件通常比 RDB 数据快照文件更大,数据恢复慢一些。
- 不要仅仅使用 RDB,因为那样会导致你丢失很多数据
- 也不要仅仅使用 AOF,因为那样有两个问题,第一,你通过 AOF 做冷备,没有 RDB 做冷备,来的恢复速度更快; 第二,RDB 每次简单粗暴生成数据快照,更加健壮,可以避免 AOF 这种复杂的备份和恢复机制的 bug。
- redis 支持同时开启开启两种持久化方式,我们可以综合使用 AOF 和 RDB 两种持久化机制,用 AOF 来保证数据不丢失,作为数据恢复的第一选择; 用 RDB 来做不同程度的冷备,在 AOF 文件都丢失或损坏不可用的时候,还可以使用 RDB 来进行快速的数据恢复。
以上答案均来自本人专栏:机器学习面试题汇总与解析(蒋豆芽面试题总结)
欢迎大家围观:https://blog.nowcoder.net/jiangwenbo
#软件开发2023笔面经#这个专栏专门用于为牛友解答面经,希望能帮助到大家。