1、mysql有哪些索引
-
普通索引
-
唯一索引
-
主键索引
-
组合索引
-
全文索引
2、mysql索引底层为什么用b+树
-
数据结构是非叶子节点+单项链表组成,b树没有采用单项链表会出现索引回查(回旋查找)的问题
3、redis的锁如果循环调用会不会出问题,如果在释放锁的时候出错了,如何保证锁成功释放?
4、linux如何将a服务器的文件复制到b服务器
-
使用scp实现服务器A向服务器B传输文件
5、linux如何查看当前cpu进程
-
使用top命令,它监视Linux上的进程,CPU和内存的使用情况
6、cpu到100%了如何定位问题
-
找到最耗CPU的进程
-
找到最耗CPU的线程
-
查看堆栈,定位线程在干嘛,定位对应代码
7、mysql慢查询的优化方案
-
首先可以检查有没有走索引,如果没有可以优化走索引
-
如果走了索引,可以查看是不是走的最优索引
-
如果已经是最优索引了,就可以去看查询的字段是不是都是必须的,如果查询了很多字段,在返回数据的时候,就会导致比较慢
-
再接着查看表中的数据是不是比较多了,是不是已经到了要分库分表的时候了(比如字段比较多有几百万行了)
-
最后可以看下硬件是不是该升级了
8、对象的回收是怎么回收的(普通对象,spring对象)
9、用到哪些设计模式
-
单例模式
-
工厂方法模式
-
抽象工厂模式
-
代理模式
-
装饰者模式
-
观察者模式
10、Mysql 查询成绩倒数五名,怎么查
-
SELECT * FROM `comment` ORDER BY `id` DESC LIMIT 5
11、学生表里面有5条重复数据 需要删除4条重复数据 怎么操作
-
用distinct 联合去重
12、list里面的字符串想要统计出现的次数怎么操作?
13、线程池数量建立多少比较合适
-
最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
14、synchronized和lock的区别
-
synchronized是关键字,Lock是接口
-
synchronized是隐式的加锁,lock是显式的加锁
-
synchronized可以作用于方法上,lock只能作用于方法块
-
synchronized底层采用的是objectMonitor,lock采用的AQS
-
synchronized只支持非公平锁,lock支持非公平锁和公平锁
15、常见的限流算法
-
漏桶算法
-
令牌桶算法
-
固定时间窗口
-
滑动时间窗口
16、redis缓存雪崩 击穿 穿透
-
缓存雪崩:大量请求访问redis,redis这个时候大量的key同时失效,请求直接打到数据库去了,这就是缓存雪崩
-
缓存击穿:请求访问redis,redis不存在,然后又访问数据库,数据库也不存在,就导致两次无用查询,这就是缓存击穿
-
缓存穿透:大量请求访问同一个key,然后这个key刚好失效,大量请求就打到数据库去了,这就是缓存穿透
17、项目中除了用来当锁,redis还有什么别的作用
-
用作缓存热点数据,降低数据库的压力
18、redis如何保证和数据库数据一致性
-
双删
19、如果想让hashmap线程安全的话怎么办?
-
使用HashTable代替HashMap
-
使用ConcurrentHashMap
20、concurrenthashmap为什么是线程安全的 底层用的是什么锁方式?
-
在1.7的时候,ConcurrentHashMap它基本上延续了HashMap的设计,采用数组加链表的形式,和HashMap不同的是ConcurrentHashMap中的数组设计分是大数组Segment和小数组HashEntry,大数组Segment就像数据库,HashEntry就像数据库中的表,存储着数据。因为Segement本身是基于ReentrantLock锁操作,这样就能保证多个线程同时访问Concurrent HashMap时,同一时间只能有一个线程能够操作相应的节点,就样就保证了ConcurrentHashMap的线程安全
-
在1.7的时候,ConcurrentHashMap虽然是线程安全的,但因为底层是数组加链表的形式,在大多情况下,因为要遍历整个链表,会降低访问性能。所有在1.8后就采用了数+链表+红黑树的方式优化了ConcurrentHashMap的实现。在1.8ConcurrentHashMap的源码中,是使用的CAS+Volatile或者synchronized的方式保证线程安全
21、接口慢的话怎么优化?
-
接口慢可能是因为数据库慢查询,可能未加索引,索引失效,join过多,in的值太多等等
-
也有可能是业务逻辑太复杂
-
锁设计不合理
-
问题解决:优化数据库的查询等
22、如何检测死锁
-
Jstack命令
-
JConsole工具
23、如果线程池的队列满了,还往里面加线程,能加得进去吗?
-
要么释放闲置的线程 要么加大线程池的深度 如果都无法做到 保证程序不会溢出的情况下 提示用户线程满了
24、了解semaphore吗
-
举一个例子:就比如有一个停车场一共有五个车位,那么最多就只能停五辆车,只有停车场有位置的时候,车才能停进来。semaphore(信号量)可以用作限流