途虎养车-Java开发-一面 面经

1、请做个简单的自我介绍

您好,我是[姓名],[学校][专业]毕业,有[X]年Java开发经验。技术栈方面,我熟练掌握Spring全家桶、MyBatis、Redis、MySQL等主流技术,对分布式系统和微服务架构有比较深入的理解。项目经验上,我主要负责过电商平台的核心业务模块开发,包括商品管理、订单处理、支付对接等,日均处理订单量在50万左右。在这个过程中,我解决过不少生产环境的性能问题,比如通过引入Redis缓存和数据库索引优化,将接口响应时间从800ms降到了100ms以内。我比较注重代码质量和系统稳定性,平时也会研究一些开源框架的源码,持续提升自己的技术能力。

2、Redis的持久化方案有哪些,如果让你设计集群会选择哪种

Redis持久化主要有三种方案:

  1. RDB快照模式,它会在指定时间间隔内将内存数据集快照写入磁盘,通过fork子进程来执行,优点是恢复速度快、文件紧凑适合备份,缺点是可能丢失最后一次快照之后的数据
  2. AOF日志模式,它记录每个写操作命令,可以配置always、everysec、no三种同步策略,优点是数据完整性好最多丢失1秒数据,缺点是文件体积大恢复慢
  3. 混合持久化,Redis 4.0之后支持,AOF重写时将数据以RDB格式写入文件开头,增量数据以AOF格式追加,兼顾了恢复速度和数据完整性

如果让我设计Redis集群,我会选择RDB+AOF混合方案。具体来说:1)主节点开启AOF持久化保证数据不丢失,配置everysec同步策略平衡性能和安全性;2)从节点只开启RDB用于快速恢复和备份;3)同时开启混合持久化aof-use-rdb-preamble,这样既保证了数据安全,又不会因为持久化影响太多性能。另外还要配置合理的AOF重写阈值,避免文件过大。

3、手撕算法:矩阵中的最短路径(类似LeetCode 64变种)

这是一个动态规划问题,我的思路是这样的:

  1. 定义dp[i][j]表示从起点到达位置(i,j)的最短路径和
  2. 状态转移方程是:dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])
  3. 边界条件:第一行只能从左边来,第一列只能从上边来
public int minPathSum(int[][] grid) {
    int m = grid.length, n = grid[0].length;
    int[][] dp = new int[m][n];
    
    dp[0][0] = grid[0][0];
    
    // 初始化第一行
    for (int j = 1; j < n; j++) {
        dp[0][j] = dp[0][j-1] + grid[0][j];
    }
    
    // 初始化第一列
    for (int i = 1; i < m; i++) {
        dp[i][0] = dp[i-1][0] + grid[i][0];
    }
    
    // 填充dp数组
    for (int i = 1; i < m; i++) {
        for (int j = 1; j < n; j++) {
            dp[i][j] = grid[i][j] + Math.min(dp[i-1][j], dp[i][j-1]);
        }
    }
    
    return dp[m-1][n-1];
}

时间复杂度O(m×n),空间复杂度可以优化到O(n)只用一维数组。

4、布隆过滤器的原理是什么

布隆过滤器是一种空间效率很高的概率型数据结构,用来判断一个元素是否在集合中。它的原理是:

  1. 使用一个bit数组和多个hash函数,添加元素时,通过k个hash函数计算出k个位置,将这些位置的bit设为1
  2. 查询元素时,同样计算k个位置,如果这些位置都是1,则元素可能存在;如果有任何一个位置是0,则元素一定不存在
  3. 特点是存在一定的误判率,可能会把不存在的元素判断为存在(假阳性),但不会把存在的元素判断为不存在(假阴性)
  4. 误判率与bit数组大小、hash函数个数、元素数量有关,可以通过增加bit数组大小和hash函数个数来降低误判率

实际应用场景包括:1)缓存穿透防护,在查询Redis之前先用布隆过滤器判断key是否存在;2)爬虫URL去重;3)垃圾邮件过滤;4)推荐系统中判断用户是否看过某个内容。优点是空间占用极小,1亿数据只需要几十MB,缺点是不支持删除操作,需要用计数布隆过滤器。

5、用过哪些锁,可重入锁是如何实现的

我在项目中用过的锁主要有这几种:

  1. synchronized关键字,这是JVM层面的锁,使用最简单,适合锁竞争不激烈的场景
  2. ReentrantLock可重入锁,它提供了更灵活的锁操作,支持公平锁、可中断、超时获取锁等特性
  3. ReadWriteLock读写锁,适合读多写少的场景,多个线程可以同时读,但写操作是互斥的
  4. 分布式锁,基于Redis的SETNX或Redisson实现,用于分布式环境下的资源互斥访问

可重

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java面试圣经 文章被收录于专栏

Java面试圣经,带你练透java圣经

全部评论
接好运
点赞 回复 分享
发布于 03-13 14:48 上海

相关推荐

昨天 21:33
已编辑
东莞理工学院 Java
📍面试公司:好未来🕐面试时间:03/14💻面试岗位:golang后端开发❓面试问题:1.&nbsp;Go&nbsp;的基本数据类型有哪些?2.&nbsp;什么是值类型和引用类型,分别有哪些?3.&nbsp;slice&nbsp;底层结构和扩容机制是什么?4.&nbsp;map&nbsp;底层基于什么实现,是有序还是无序?5.&nbsp;对&nbsp;Go&nbsp;的&nbsp;channel&nbsp;怎么理解?6.&nbsp;channel&nbsp;一般用在什么业务场景?7.&nbsp;无缓冲和有缓冲&nbsp;channel&nbsp;的区别是什么?8.&nbsp;如何深拷贝&nbsp;slice,避免多个变量互相影响?9.&nbsp;Redis&nbsp;适用哪些业务场景?10.&nbsp;为什么&nbsp;Redis&nbsp;单线程还能支持高并发?11.&nbsp;epoll&nbsp;在&nbsp;Redis&nbsp;中用在什么场景?12.&nbsp;Redis&nbsp;的&nbsp;key&nbsp;过期策略有哪些?13.&nbsp;Redis&nbsp;过期删除后内存会立刻释放吗?14.&nbsp;Redis&nbsp;内存满了有哪些淘汰策略?15.&nbsp;Redis&nbsp;持久化方案有哪些?16.&nbsp;RDB&nbsp;和&nbsp;AOF&nbsp;区别是什么?17.&nbsp;Redis&nbsp;高可用方案有了解吗?18.&nbsp;Redis&nbsp;主从、哨兵、集群的区别?19.&nbsp;ES&nbsp;主要适用于什么场景?20.&nbsp;业务数据(如订单)能不能存在&nbsp;ES?21.&nbsp;多表数据聚合同步到&nbsp;ES&nbsp;怎么实现?22.&nbsp;ES&nbsp;集群健康状态有哪几种,分别代表什么?23.&nbsp;ES&nbsp;设置分片和副本,允许节点宕机数量怎么判断?24.&nbsp;Kafka&nbsp;和&nbsp;RocketMQ&nbsp;的区别是什么?25.&nbsp;Kafka&nbsp;为什么会出现消息丢失?26.&nbsp;如何避免&nbsp;Kafka&nbsp;消息丢失?27.&nbsp;Kafka&nbsp;的&nbsp;at&nbsp;least&nbsp;once&nbsp;机制是什么?28.&nbsp;业务层如何保证消息不丢失、最终一致?29.&nbsp;MySQL&nbsp;事务隔离级别有哪些?30.&nbsp;MySQL&nbsp;默认隔离级别是什么?31.&nbsp;可重复读的含义是什么?32.&nbsp;什么场景会使用不同的事务隔离级别?33.&nbsp;InnoDB&nbsp;可重复读是怎么实现的?34.&nbsp;MySQL&nbsp;有哪些存储引擎,区别是什么?35.&nbsp;MyISAM&nbsp;适用什么业务场景?36.&nbsp;联合索引的最左匹配原则是什么?37.&nbsp;MySQL&nbsp;默认索引类型是什么,和哈希索引区别?38.&nbsp;多表关联查询、聚合查询如何设计索引?39.&nbsp;研发工程师应该如何应对和使用&nbsp;AI?40.&nbsp;使用&nbsp;AI&nbsp;编程工具有哪些风险?41.&nbsp;怎么避免&nbsp;AI&nbsp;生成代码带来的线上问题?42.&nbsp;平时用什么开发工具和&nbsp;AI&nbsp;模型?43.&nbsp;使用&nbsp;AI&nbsp;辅助开发遇到过哪些问题,怎么解决?44.手撕sql包括建立索引等等🙌面试感想:感动坏了,春招以来最舒服的一场面试,大部分问题都回答出来了,并且面试官在你回答出来了之后,还会给予正反馈说没错,你说的对,然后记不太清楚的问题,他还会给予提示,然后告诉你该怎么去回答,并且给出他的看法,也是一天直接速通了两面下周三约HR面
发面经攒人品
点赞 评论 收藏
分享
03-13 22:49
门头沟学院 Java
一面&nbsp;1.syn&nbsp;和&nbsp;reen&nbsp;区别2.reen&nbsp;公平锁非公平怎么实现的3.对象调用被子类重写的方法&nbsp;jvm&nbsp;底层怎么实现的4.分布式锁5.websocket&nbsp;底层怎么实现的6.websocket&nbsp;和&nbsp;http&nbsp;长连接有啥区别7.dfs&nbsp;深度过深造成栈溢出你怎么处理8.问实习9.打家劫舍&nbsp;3二面面了一个半小时直接燃尽了1.自我介绍2.你觉得你实习做的亮点3.拷打实习4.主从模式下的&nbsp;redis,此时主节点内容刚写,从节点还没来及同步&nbsp;redis&nbsp;宕机了,此时加的分布式锁还在吗5.主从&nbsp;哨兵&nbsp;cluster&nbsp;的区别和优缺点6.redis&nbsp;底层数据类型的组成和底层的扩容机制7.redis怎么查看&nbsp;key的内存占用8.mysql&nbsp;事务是怎么实现的9.mysql&nbsp;突然宕机重启了数据会丢失吗?10.mysql&nbsp;怎么选择索引11.底层怎么实现的12.http&nbsp;请求报文里面有哪些内容13.http&nbsp;长连接说一下14.长连接什么情况下会断开15.以前解决过的一个最难的技术问题16.实习中成长最大的一点17.实习过程中遇到的最大的挑战18.微信加好友这个功能怎么实现,需要定义那些接口,表怎么设计19.手撕,面试官自己出的一个题,题目本身不难,但是刚开始理解题目很困难,看懂题目花了&nbsp;10&nbsp;分钟。20.说一下你自己觉得学的最深入的一个技术是啥21.说一下自己的优点和觉得可以改进的一个点22.最近两三年觉得最有成就感的事情23.为什么从前司离职24.对以后的工作有什么想法三面1.对转语言有什么问题吗?2.转&nbsp;go&nbsp;的话你准备怎么学习呢?3.学习过程中遇到困难你会怎么解决?4.理解一些底层原理你会怎么做呢?5.实习遇到的最大的困难6.实习最大的收获7.实习中主动发现问题并且自己解决的例子8.对以后有什么计划,你做了什么来实现这个计划?9.自己在技术上面有哪些优缺点?10.对技术框架有执念吗?11.实习中压力最大的场景是什么12.怎么去理解程序员的责任心?你对自己有什么要求?13.项目时间紧你怎么处理呢?14.你除了后端开发还对那些感兴趣呢?15.有没有计划学习新技术呢?16.对&nbsp;Agent&nbsp;了解多少?17.喜欢游戏嘛?玩什么游戏?对做游戏感兴趣吗?下面换成hr继续问了18.是哪里人?19.上一段实习为什么离职20.找校招工作考虑那些因素21.最看重那几个说两三个22.有面到二三面的公司吗23.准备校招阶段一天花多少时间准备校招24.AiCoding&nbsp;占比多少你自己做项目25.上一段实习有什么技术对你有帮助和收货吗26.这种技术你到下一家公司有什么复用的吗27.实习阶段从&nbsp;mt&nbsp;哪里学到了什么28.他对你的反馈如何29.三段实习中你最喜欢的是那段30.校招可以提前实习到毕业吗31.对微派有什么了解吗?32.平时学习了解方面都是那些东西33.你为什么不考研反问最后排序挂了没辙。
点赞 评论 收藏
分享
03-12 21:07
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
6
分享

创作者周榜

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