途虎养车-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-16 11:05 河南
接好运
点赞 回复 分享
发布于 03-13 14:48 上海

相关推荐

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.你为什么不考研反问最后排序挂了没辙。
点赞 评论 收藏
分享
评论
1
8
分享

创作者周榜

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