每天一套面试题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" → "二进制格式的日志",于记录所有更改数据的操作)

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

记录刷过的面试真题

全部评论
mark收藏了
点赞 回复 分享
发布于 11-09 21:19 河南

相关推荐

11-21 15:20
门头沟学院 Java
一面 1.  介绍一个你熟悉的项目2.  当时为什么这个项目?上线了吗?3.  你认为什么是RAG?4.  它跟微调有什么区别?效果上会有什么区别吗?为什么有两种方式?5.  有实际做过微调吗?6.  Rag 去做判卷,你的检索内容是什么?7.  用的是什么向量数据库?为什么最后选了它?8.  Redis 的缓存策略,为什么要去设计的一个热点题目缓存这样的东西?9.  Rocketmq 我们在正常的发送和消费的时候,怎么保证这个消息是不丢失的。10. 在消息发送出来写到 broker 的时候,在你的发送里面要做什么样的设置才可以保证你一定会写入这个?11. 你在做哪些开源的事情?12. 你对哪一个技术中间件是最熟悉的?13. Redis 它为什么很快?14. 为什么单线程还会比多线程要快?感觉这有点反直觉。15. 多线程比单线程执行会多一些成本吗?16. 上下文切换有哪些具体的开销?17. 什么是程序计数器?18. 所以它是跟线程绑定的吗?19. Redis 多路复用20. 你了不了解 Redis 6.0 之后为什么引入了多线程?21. 你觉得你对Redis的掌握程度是怎么样的?评价一下22. 你现在学习是通过什么方式去学习一些新的知识?你有什么感兴趣的方向吗?23. 假设现在你跟你的mentor,你的导师上你们有意见冲突,你们的意见完全相反,在一件事情上,你会如何处理这样的事情?24. 算法题 mid 不含重复字符的最长子串的长度25. 你实际做项目里面,你觉得你碰到过最难的问题是什么?你如何解决它?
查看25道真题和解析
点赞 评论 收藏
分享
评论
2
6
分享

创作者周榜

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