一 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
。相较于 synchronized
,Lock
是一种显式锁,可以灵活控制锁的获取和释放,支持可重入锁、读写锁、超时锁等特性。
区别:
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
实现分布式锁,利用事务的行锁机制。