目录
1.java中有哪些集合?哪些是有序的,哪些是无序的。
2.怎么实现多线程?一个线程的生命周期是多久。
继承Thread类
实现Runnable接口
实例化Thread.start()
线程的生命周期:新建,就绪,运行,阻塞以及死亡。
3.Sql如何优化?
(1)建立索引
(2)避免全表扫描
(3)避免使用select *
(4)优化in语句,若后面是子查询用left join,如果是确定值,用or连接
4.Sql的索引在什么情况下会失效?
(1)复合索引
(2)Like的%xxx会失效 xxx%不会失效
(3)要求使用的所有字段,都必须单独使用时能使用索引
(4)mysql认为全表扫面要比使用索引快(表里就几条数据)
5.Redis在什么情况下会用?Redis是单线程的还是多线程的?Redis的数据类型?
使用redis:读取频繁,或读>写的时候。
Redis是单线程,使用多路I/O复用模型,非阻塞I/O;
最常用的数据类型:
String
Hash
List
Set
Sorted set
pub/sub
Transactions
6.Redis雪崩如何处理?
什么是雪崩:缓存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。
最常用解决方法:在批量往Redis存数据的时候,把每个Key的失效时间都加个随机值
setRedis(Key,value,time + Math.random() * 10000);
7.mq相关问题
MQ是消息队列。
最大优点:解耦、异步处理、削峰/限流
缺点:不宜维护
8.乐观锁和悲观锁
乐观锁适用于多读
悲观锁适用于多写
9.事务
什么是事务
一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败
就是将n个组成单元放到一个事务中
mysql事务
默认的事务:一条sql语句就是一个事务 默认就开启事务并提交事务
事务的特性和隔离级别
事务的特性ACID
- 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作 要么都发生,要么都不发生。
- 一致性(Consistency)一个事务中,事务前后数据的完整性必须保持一致。
- 隔离性(Isolation)多个事务,事务的隔离性是指多个用户并发访问数据库时, 一个用户的 事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
- 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变 就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
事务的隔离级别
- read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决
- read committed:读取已经提交的数据 :可以解决脏读 ---- oracle默认的
- repeatable read:重读读取:可以解决脏读 和 不可重复读 —mysql默认的
- serializable:串行化:可以解决 脏读 不可重复读 和 虚读—相当于锁表
事务的传播行为
- 保证同一个事务中
PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认)
PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常 - 保证没有在同一个事务中
PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行