百度 java正式批一面面经

百度 java正式批一面面经
最新回答
没事别惹我

2022-02-18 04:56:21

1. sku与spu的区别,createTime存放类型及查询当天sku信息的SQL语句
  • SPU与SKU区别

    SPU(Standard Product Unit):标准化产品单元,是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息集合,描述了产品的共同属性,如一部手机是一个SPU,它包含品牌、型号等通用属性。

    SKU(Stock Keeping Unit):库存量单位,是物理上不可分割的最小存货单元,用于管理库存和销售,一部手机的不同颜色、存储容量等组合会生成不同的SKU,每个SKU有独立的库存数量。

  • createTime存放类型:通常使用datetime类型,因为它能直观地表示日期和时间,包含年月日时分秒信息,方便进行日期相关的查询和计算。而long类型一般用于存储时间戳,是自某个固定时间点(如1970 - 01 - 01 00:00:00 UTC)以来的毫秒数或秒数。
  • 查询当天sku信息的SQL语句
SELECT * FROM sku_table WHERE DATE(createTime) = CURDATE();2. 优化器错误的执行计划及解决方法
  • 优化器错误执行计划原因:优化器基于成本估算选择执行计划,当数据分布统计信息不准确、数据库环境变化(如硬件资源、数据量增长)或SQL语句复杂导致优化器难以准确评估时,可能选择错误执行计划。
  • 解决方法

    更新统计信息:使用ANALYZE TABLE命令更新表的统计信息,让优化器能基于准确数据分布进行成本估算。

    使用索引提示:在SQL语句中通过索引提示指定使用特定索引,如SELECT * FROM table_name FORCE INDEX (index_name) WHERE ...。

    重写SQL语句:优化SQL结构,如避免使用复杂子查询、合理使用连接条件等,使优化器能生成更优执行计划。

3. 身份证号加索引的方法
  • 身份证号是字符串类型,在MySQL中创建索引可直接使用CREATE INDEX语句,例如:
CREATE INDEX idx_id_card ON user_table(id_card);
  • 若身份证号有唯一性要求,可创建唯一索引:
CREATE UNIQUE INDEX idx_unique_id_card ON user_table(id_card);4. 数据库死锁问题的发现、定位和解决
  • 发现死锁

    查看错误日志:数据库错误日志会记录死锁相关信息,如MySQL的错误日志文件。

    使用命令:在MySQL中可使用SHOW ENGINE INNODB STATUS命令查看最近一次死锁的详细信息。

  • 定位死锁:通过错误日志或SHOW ENGINE INNODB STATUS命令输出,分析死锁涉及的事务、锁类型、等待资源和持有资源等信息,确定死锁产生原因和相关SQL语句。
  • 解决死锁

    终止事务:根据业务情况,选择终止其中一个或多个事务,释放锁资源。

    优化事务:减少事务持有锁的时间,如将大事务拆分为小事务;合理设计事务隔离级别;避免在事务中进行耗时操作。

5. 数据库中的锁及MVCC原理
  • 数据库中的锁

    共享锁(S锁):又称读锁,多个事务可同时持有同一资源的共享锁,用于读取操作。

    排他锁(X锁):又称写锁,一个事务持有某资源的排他锁时,其他事务不能获取该资源的任何锁,用于写入操作。

    意向锁:表级锁,分为意向共享锁(IS)和意向排他锁(IX),用于提高锁获取效率,避免对整个表加锁。

  • MVCC原理:多版本并发控制,通过保存数据在某个时间点的快照实现并发控制。每个事务开始时获得一个唯一的事务ID,数据行有创建版本号和删除版本号。读取时根据事务ID和版本号判断数据可见性,实现非锁定读,提高并发性能。
6. 两阶段提交
  • 准备阶段:协调者向所有参与者发送准备请求,参与者执行事务操作并将Undo和Redo信息写入日志,若成功则返回准备就绪消息,否则返回失败消息。
  • 提交阶段:若所有参与者都返回准备就绪,协调者发送提交请求,参与者完成事务提交并释放资源;若有参与者返回失败,协调者发送回滚请求,参与者利用Undo信息回滚事务。
7. MySQL优化随机读写造成的IO延迟的操作
  • 使用缓冲池:InnoDB存储引擎的缓冲池缓存数据页和索引页,减少磁盘IO次数。
  • 优化索引:合理设计索引,使查询能快速定位到数据,减少随机读取的数据量。
  • 分区表:将大表按一定规则分区,将数据分散到不同物理位置,提高并行读写能力。
  • 使用SSD存储:SSD具有更快的随机读写速度,可显著降低IO延迟。
8. 幻读、索引下推和索引失效
  • 幻读:一个事务在读取某个范围内的记录时,另一个事务在该范围内插入新记录,导致第一个事务再次读取时发现多了记录,好像出现了幻觉。可通过设置事务隔离级别为可串行化或使用间隙锁解决。
  • 索引下推:MySQL 5.6引入,在存储引擎层对索引包含的条件进行过滤,减少回表次数,提高查询效率。
  • 索引失效:常见原因有使用函数操作索引列、使用不等于(!=或<>)操作符、使用OR条件连接非索引列等,导致优化器放弃使用索引而进行全表扫描。
9. 常见的限流算法
  • 计数器算法:在固定时间窗口内统计请求数量,若超过阈值则限流。
  • 滑动窗口算法:将时间窗口划分为多个小窗口,动态滑动窗口统计请求数量,更精确控制流量。
  • 漏桶算法:请求以固定速率进入漏桶,漏桶以固定速率处理请求,超出漏桶容量的请求被丢弃或等待。
  • 令牌桶算法:以固定速率生成令牌放入桶中,请求需获取令牌才能执行,若桶中无令牌则限流。
10. Spring Boot自动装配原理
  • Spring Boot启动时扫描主配置类所在包及其子包下的组件,通过@SpringBootApplication注解(包含@ComponentScan、@EnableAutoConfiguration等)开启自动配置。
  • @EnableAutoConfiguration导入AutoConfigurationImportSelector,该类从META - INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中读取自动配置类列表,根据条件注解(如@ConditionalOnClass、@ConditionalOnMissingBean等)判断是否加载自动配置类,实现自动装配。
11. 无法解决循环依赖问题的情况及处理方法
  • 无法解决的情况

    构造器注入循环依赖:Spring无法在对象创建完成前注入依赖,会导致循环依赖无法解决。

    多例Bean循环依赖:多例Bean每次获取都是新实例,Spring无法缓存中间状态解决循环依赖。

  • 处理方法

    重构代码:调整类设计,避免出现循环依赖关系。

    使用Setter注入:将构造器注入改为Setter注入,让Spring能在对象创建完成后注入依赖。

    使用@Lazy注解:在依赖的Bean上添加@Lazy注解,延迟加载依赖,打破循环依赖。

12. Redis分布式锁的原理
  • 获取锁:客户端向Redis发送SET key value NX PX milliseconds命令,NX表示只有key不存在时才设置,PX设置过期时间,若命令执行成功则获取锁。
  • 释放锁:客户端执行Lua脚本判断锁的value是否为自己设置的值,若是则删除锁,避免误删其他客户端的锁。
  • 保证原子性:使用Redis事务或Lua脚本保证获取和释放锁操作的原子性。
13. 渐进式哈希
  • Redis的哈希表采用渐进式哈希策略进行扩容。当哈希表负载因子超过阈值时,启动扩容过程。
  • 不是一次性将所有数据迁移到新哈希表,而是在每次执行插入、删除、查找等操作时,将部分数据从旧哈希表迁移到新哈希表,直到所有数据迁移完成,减少扩容对性能的影响。
14. ThreadLocal原理及数据传递
  • 原理:ThreadLocal为每个线程提供独立的变量副本,通过Thread类中的ThreadLocalMap存储变量副本,键为ThreadLocal对象,值为变量副本。
  • 数据传递:主线程将数据存入自己的ThreadLocal变量中,子线程通过继承主线程的ThreadLocalMap或通过参数传递ThreadLocal对象,在子线程中获取该ThreadLocal对象对应的值。
15. 零拷贝
  • 零拷贝指计算机执行操作时,CPU不需要先将数据从一处拷贝到另一处,减少数据拷贝次数和CPU上下文切换,提高数据传输效率。
  • 在Linux中,通过sendfile系统调用实现零拷贝,将文件数据直接从内核缓冲区发送到网络套接字,避免用户空间和内核空间之间的数据拷贝。
16. 动态线程池及线程池死锁问题
  • 动态线程池:可根据系统负载和业务需求动态调整线程池参数(如核心线程数、最大线程数、队列容量等),提高系统资源利用率和响应速度。
  • 线程池死锁问题

    原因:任务在执行过程中又提交了相同类型的任务到线程池,且线程池队列已满,新任务无法执行,导致线程等待,形成死锁。

    解决方法:避免任务内部提交相同类型任务;合理设置线程池参数,如增大队列容量、调整核心线程数和最大线程数;使用有界队列并设置拒绝策略。