五八 && 领岳科技面经 2024.06.06

五八面经

1、多线程打印有多少种实现方式?

2、ReentrantLock中的公平锁是怎么实现的?

3、Redis用在什么场景下?分布式锁怎么设置?如何解锁?如果想要续锁应该怎么做?

4、redis单线程怎么支持10w qps的并发?

5、mysql读写怎么实现的优化?答分库分表

6、怎么实现接口的幂等性?

7、G1垃圾收集器和CMS有什么区别?如果内存空间特别大的情况下,用哪种垃圾收集器比较好?

8、线上CPU飙升问题如何排查?

9、kafka有用过吗?什么场景下用到?如果想要消息被下游全部接收到,有什么方法?

这道题没有回答好,给出标准答案:

复制机制

Kafka使用了分区和副本的概念。每个分区可以有多个副本,分布在不同的Broker上。

当消息写入到一个分区时,它会被复制到该分区的所有副本上。这样,即使某个Broker发生故障,仍然可以从其他副本中读取数据,确保数据的可靠性。
ISR(In-Sync Replicas)机制

ISR是指与Leader副本保持同步的副本集合。

Kafka确保只有ISR中的副本才能成为Leader,这确保了Leader副本在消息写入后会等待ISR中的其他副本都完成同步,从而保证了消息的可靠性。
消息确认机制

生产者发送消息时可以选择等待相应的确认(通过配置acks参数)。例如,配置acks=all表示Partition Leader接收到消息之后,还必须要求ISR列表里跟Leader保持同步的那些Follower都要把消息同步过去,才能认为这条消息是写入成功了。

消费者在成功消费一条消息后,会发送消息确认机制,将消息标记为已消费。
消费者重试

如果消息消费失败,消费者可以实现重试策略,尝试重新消费失败的消息,直到成功为止。
手动提交Offset

Kafka消费者默认可能采用自动提交Offset的策略,这可能会导致在消息真正被业务逻辑消费完成之前,Offset已经被提交,进而造成消息丢失。

为了确保消息被全部消费,建议关闭自动提交Offset,并在自己处理完毕之后手动提交Offset。
幂等性处理

在某些情况下,即使消息被成功消费并提交了Offset,但由于某些原因(如进程崩溃)可能导致数据没有真正保存到目标系统。此时,如果消息被重新消费,可能会导致数据重复。因此,可以通过幂等性处理来确保数据只被保存一次。
分布式事务

在需要跨多个系统或服务保证数据一致性的场景中,可以使用分布式事务来确保消息被全部接收并消费。这通常涉及到使用支持分布式事务的数据库或中间件。

领岳科技

1、遇到过线上问题吗?如何解决的?

2、项目经历简述

3、算法题:

现有一个内部只有若干"1"、"-1","0"的int数组,要求在原数组上进行操作,使所有的"1"均在数组的左面,所有的"0"均在数组的右面

实现

java 复制代码
public void reorderArray(int[] arr) {  
    int low = 0;  
    int mid = 0;  
    int high = arr.length - 1;  
  
    while (mid <= high) {  
        if (arr[mid] == 1) {  
            // Swap arr[mid] with arr[low]  
            int temp = arr[low];  
            arr[low] = arr[mid];  
            arr[mid] = temp;  
            low++;  
            mid++;  
        } else if (arr[mid] == 0) {  
            // Only move mid pointer  
            swap(arr, mid, high);  
            high--;  
        } else {  
            // Skip -1 or other non-1 non-0 values  
            mid++;  
        }  
    }  
}  
  
// Helper function to swap two elements in the array  
private void swap(int[] arr, int i, int j) {  
    int temp = arr[i];  
    arr[i] = arr[j];  
    arr[j] = temp;  
}

问:为什么右指针不能和mid一起移动?为什么左指针可以和t一起移动?这个问题没有回答好

右指针不能移动的反例

1,-1,1,-1,0,1,-1,0,1

如果右指针和mid同时移动,当指向第一个0和第二个0的指针交换完毕,就会扫过0和0继续走到1和-1,这样会漏解,不符合题目的要求

为什么左指针可以和t一起移动?面试官说因为low只能指向-1,所有1在mid扫过的部分都已经放在left了,一旦放在left,left就可以向前走;但是0放在右边的话,0不能向左走,因为可能0的前面还有1

相关推荐
这儿有个昵称9 小时前
互联网大厂Java面试场景:从Spring Boot到微服务架构
java·spring boot·消息队列·微服务架构·大厂面试·数据库优化
填满你的记忆10 小时前
【从零开始——Redis 进化日志|Day5】分布式锁演进史:从 SETNX 到 Redisson 的完美蜕变
java·数据库·redis·分布式·缓存
lendsomething10 小时前
Spring 多数据源事务管理,JPA为例
java·数据库·spring·事务·jpa
nsjqj10 小时前
JavaEE初阶:多线程初阶(2)
java·开发语言
黎雁·泠崖10 小时前
Java面向对象:对象数组核心+综合实战
java·开发语言
Mr.LJie11 小时前
记录使用iText7合并PDF文件、PDF发票、PDF火车票
java·pdf
野生技术架构师11 小时前
2026最新最全Java 面试题大全(整理版)2000+ 面试题附答案详解
java·开发语言
oscar99911 小时前
软件测试面试全攻略之高级篇
面试·职场和发展·测试高级
小北方城市网11 小时前
SpringBoot 集成 MinIO 实战(对象存储):实现高效文件管理
java·spring boot·redis·分布式·后端·python·缓存
Solar202511 小时前
工程材料企业数据采集系统十大解决方案深度解析:从技术挑战到架构实践
java·大数据·运维·服务器·架构