每天一套面试题Day8-小红书(2)

11.说说缓存穿透、击穿、雪崩的区别

缓存穿透大量查询原本不存在的数打到数据库,缓存空值,布隆过滤器 缓存击穿是热key失效,设置逻辑过期,互斥锁 缓存雪崩是大量缓存同时失效。随机过期时间,提高缓存可用性,比如集群

12.从「敲下一个 URL」到「页面出现在屏幕」整条链路全景

先解析域名,协议,端口(https默认443,http强转https),DNS协议根据域名找到ip,TCP三次握手建立连接,IP协议帮助找到链路,到达服务器,服务器收到请求,返回页面信息,显示在屏幕上。 四次挥手

加上TCP头,IP头,MAC头(通过ARP协议知道以太网中对应的IP的MAC),在网卡加上报头和起始帧分界符 主机到本地DNS服务器是递归,本地DNS服务器到各级DNS服务器(根域名服务器,顶级域名服务器,权限域名服务器)是迭代

13.TCP 与 UDP 的 10 大核心区别是什么?

TCP面向连接,会三次握手建立连接,四次挥手释放连接,因此不支持组播等,只支持单播。而UDP无连接,支持组播 TCP可靠的,支持重传,UDP不可靠,只管发送数据报。 TCP面向字节流,UDP面向报文为单位发送。UDP比TCP速度要快。因此如果对数据丢失比较敏感选TCP,比如HTTP协议,FTP协议???对实时性要求高可以用UDP,比如视频流,DNS协议。 TCP支持拥塞控制,UDP不支持。

"FTP协议 头部大小"(TCP 20-60字节 vs UDP 8字节) "有序性"(TCP保证顺序,UDP不保证)

14.TCP 协议如何保证可靠传输?

面向连接,会三次握手建立连接,四次挥手释放连接。三次握手时,确认彼此都能收能发,并且同步序列号。支持重传。 TCP支持拥塞控制

alt alt alt TCP发送窗口是拥塞窗口和对方的接收窗口中更小的那个。 考虑拥塞窗口(网络拥堵情况),对方的接收窗口(接收方的处理能力) 拥塞窗口,发送窗口是发送方内部维护的一个「计算值」,不在报文中传输。 alt 序号+累积确认 ACK+超时重传 保证 数据不漏、不乱。 校验和保证 数据不损坏。 滑动窗口与流量控制 保证 发送速率可控。 拥塞控制 保证 网络不被压垮

15.介绍一下Redis的集群模式。

cluster是Redis官方推出的,提高可用性。针对单个redis内存不足,做了横向扩展,并且每个又有从节点。 没有哨兵,彼此互相监控

Redis切片集群(官方Redis Cluster)固定使用16384(16K)个哈希槽(Hash Slot),每个键通过 CRC16 校验后对 16384 取模来决定放入哪个槽。 集群中的每个主节点负责一部分哈希槽。哈希槽默认均分映射到具体的主节点中,也可以手动分配。 每个主节点都应该至少有一个从节点。 Redis切片集群,持续地与其他节点进行通信,互相监控健康状态。当需要判断一个主节点是否失效时,集群中的其他主节点会共同参与投票,选举出一个新的主节点来接管服务。

16.讲一下限流算法。

  • 固定窗口计数器(Fixed Window Counter)

原理:将时间划分为固定的窗口(例如每秒一个窗口),每个窗口内有一个计数器。请求到来时,计数器增加,如果计数器超过阈值,则拒绝请求。 优点:实现简单,内存占用少。 缺点:在窗口切换时可能会遇到突发流量。例如,假设每秒允许100个请求,如果在当前窗口的最后100ms内收到了100个请求,下一个窗口的开始100ms内又收到了100个请求,那么在这200ms内就处理了200个请求,这可能会超过系统承载能力。

  • 滑动窗口计数器(Sliding Window Counter)

原理:将固定窗口进一步细分成多个小窗口(例如将1秒划分为10个100ms的小窗口),然后统计当前时间点往前一个单位时间(1秒)内所有小窗口的请求数之和。这样,窗口是滑动的,而不是固定的。 优点:相对于固定窗口,滑动窗口能够更平滑地控制流量,因为窗口是连续滑动的,不会在固定边界处重置。 缺点:需要存储多个小窗口的计数,内存占用相对固定窗口会高一些。

  • 漏桶算法(Leaky Bucket)

原理:可以想象一个漏水的桶,请求像水一样流入桶中,桶以固定的速率漏水(处理请求)。如果桶满了(超过容量),则新的请求会被丢弃或排队(取决于实现)。 优点:能够以恒定的速率处理请求,平滑流量,保护系统不受突发流量影响。 缺点:无法应对突发流量,因为处理速率是固定的。即使系统有能力处理更多的请求,漏桶也会按照固定速率处理。

  • 令牌桶算法(Token Bucket)

原理:系统以固定速率向桶中添加令牌,请求需要从桶中获取一个令牌才能被处理。如果桶中没有令牌,则请求被拒绝。桶有最大容量,防止令牌无限累积。 优点:允许突发流量,只要桶中有足够的令牌,就可以一次性处理多个请求。这对于需要处理突发流量的场景(如秒杀)非常有用。 缺点:实现相对复杂,需要维护令牌的生成和消耗

17.什么是进程和线程?进程和线程的区别?

进程是分配资源的基本单位,线程是CPU调度的基本单位。 线程共享进程的空间,切换线程的代价要比切换进程的代价小。

通信方式 进程:通过进程间通信(IPC)进行数据交换,如管道、消息队列、共享内存。 线程:通过共享内存直接通信,速度快但需注意同步

18.为什么 MySQL 采用 B+ 树作为索引?

数据存在磁盘中,所以我们要尽可能的减少IO。使用B+树,所有的数据都在叶子节点,查找速度相对稳定。并且每个分支

联合索引的存储结构是将多个列的值组合在一起形成一个复合键,按照字典序进行排序存储。 最左前缀原则指的是在使用联合索引时,查询条件必须从索引的最左列开始,才能有效利用索引进行加速查询。 只有满足最左前缀的查询条件,才能充分发挥联合索引的性能优势。节点没有放数据,所以能容纳更多,树的高度较低,减少了磁盘 I/O 次数

叶子节点双向链表,所有数据都维护在叶子节点–对范围查询和排序性能更好

19.联合索引的存储结构与最左前缀原则

联合索引的存储结构是把n个值作为复合索引,最左前缀指的是必须要根据索引建立的顺序写sql查询,否则索引就失效了

联合索引的存储结构是将多个列的值组合在一起形成一个复合键,按照字典序进行排序存储。 最左前缀原则指的是在使用联合索引时,查询条件必须从索引的最左列开始,才能有效利用索引进行加速查询。 只有满足最左前缀的查询条件,才能充分发挥联合索引的性能优势。

20.redo log / undo log / binlog 各自作用?

redo log用于数据恢复,("re-do" → "重新做一遍",把事务已经提交但未持久化的操作"重新做一遍") undo log用于事务回滚,("un-do" → "撤销操作",比如一个INSERT语句,undo log会记录一个DELETE语句与之对应) binlog用于数据复制和恢复,("binary log" → "二进制格式的日志",于记录所有更改数据的操作)

#面试真题#
每日一套面试真题 文章被收录于专栏

记录刷过的面试真题

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务