【面经】2024秋快手面试真题

一 MySQL事务的隔离级别

        MySQL 提供四种事务隔离级别,分别决定了一个事务能否看到其他事务中的未提交或已提交的数据。它们由低到高分别是:

1.READ UNCOMMITTED(未提交读)

        事务可以看到其他事务中未提交的数据。存在脏读的问题:。

2.READ COMMITTED(提交读)

        事务只能看到其他事务已提交的数据。存在不可重复读的问题,也就是同一事务中两次读取同一行,结果不同。

3.REPEATABLE READ(可重复读,MySQL默认级别)

        事务多次读取同一数据,结果一致(不会出现不可重复读问题)。存在幻读的问题,即事务A读取一批数据后,事务B插入了一些新数据,事务A再次查询时发现了“幻影”行。

4.SERIALIZABLE(可串行化)

        最高级别,事务间通过加锁防止并发,确保完全隔离。代价高,性能差。

二 lock 和 synchronized 的区别

        synchronized是Java 关键字,用于方法或代码块上,锁定对象或类,确保同一时间只能有一个线程访问被锁定的代码。它是一种隐式锁机制,简化了加锁和解锁的过程,但无法灵活控制锁的获取和释放。

        Lock是Java 并发包 java.util.concurrent.locks 提供的锁接口,常用实现类ReentrantLock。相较于 synchronizedLock 是一种显式锁,可以灵活控制锁的获取和释放,支持可重入锁、读写锁、超时锁等特性。

区别

  • synchronized 是 JVM 层面的锁,Lock 是 Java 语言层面的锁。
  • Lock 提供了更多灵活性(可尝试锁、超时锁、非阻塞锁等)。
  • synchronized 适合简单场景,Lock 适合复杂的并发场景。

三 哪些场景用到了锁 ,怎么选择和使用的 

        使用锁的典型场景包括:

        1.并发数据访问:例如在电商系统中,多个用户同时修改同一件商品的库存时,需要加锁来避免数据不一致。

        2.共享资源访问:当多个线程访问共享资源(如文件、数据库连接)时,加锁可以防止数据竞争。

        3.任务调度:在并发任务调度场景中,需要锁来确保任务不会被多个线程同时执行。

        当涉及到简单并发控制时,使用 synchronized即可,但对于复杂的并发场景,例如尝试锁、超时锁,使用ReentrantLock。对于读多写少的情景,可以使用读写锁(ReentrantReadWriteLock) 来提高读性能。

四 你用过ES吗,它是什么,为什么使用ES

        Elasticsearch 是一个分布式搜索和分析引擎,基于 Lucene 构建,通常用于全文搜索、日志分析、实时数据流处理等场景。ES的特点包括:

        1.全文搜索能力强:支持复杂查询、模糊匹配、评分排序等功能。

        2.高性能:能够在海量数据上快速搜索、索引、分析。

        3.分布式架构:天然支持集群扩展,数据分片存储。

        我们在使用时,可以将数据以 JSON 文档的形式存储到 ES 中,使用 RESTful API 提交查询请求,进行精确查询、模糊查询、聚合分析等操作。ES还提供了分片、备份和自动恢复机制。

五 介绍HashMap

        HashMap 是 Java 中常用的键值对集合,基于哈希表实现,其插入、查找、删除的时间复杂度平均为 O(1)。但是它线程不安全,多线程环境下,多个线程同时操作 HashMap 会导致数据不一致,需使用 ConcurrentHashMap

六 假如有个QPS很高的接口  如何实现高效查询,怎么优化

1.缓存优化

        使用 Redis 或 Memcached 做缓存,减少数据库的查询压力;实现缓存穿透、缓存雪崩、缓存击穿的防护措施。

2.数据库优化

        建立合理的索引,优化 SQL 查询;当数据量大时,可以水平分库分表提高数据库性能;使用 NoSQL 数据库如 MongoDB、Cassandra 处理海量数据。

3.限流和熔断

        使用如 Hystrix 的熔断机制,防止高并发时系统雪崩。使用令牌桶或漏桶算法限流,防止接口过载。

4.异步与批量处理

        将同步接口转换为异步处理,减少高并发下的资源等待。使用批量处理,减少对数据库的频繁请求

七 Kafka和RabbitMQ两者之间的区别

        Kafka:高吞吐量、适合处理大量日志、事件流;以分布式、持久化的消息流平台为设计目标,消息存储在磁盘上,消费者可以选择多次读取相同消息。适合大数据场景,如日志分析、流式数据处理。

        RabbitMQ:轻量级,延迟低,支持复杂的消息路由,使用传统的消息代理模式,消息在内存中存储,消费者只能读取一次。适合金融、订单处理等需要强一致性、低延迟的场景。

八 分布式锁如何实现

1.基于 Redis 实现分布式锁:

        使用 Redis 的 SETNX 命令,只有在键不存在时才能创建锁。为锁设置过期时间,防止死锁。

2.基于 Zookeeper 实现分布式锁:

        利用 Zookeeper 的临时有序节点特性,创建锁节点,每个客户端创建一个有序节点,最小编号的节点获得锁。

3.基于数据库实现分布式锁:

        使用数据库表的 SELECT FOR UPDATE 实现分布式锁,利用事务的行锁机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值