设计模式:
单例模式:
如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
好处:
减少新生成实例的消耗
减少jvm垃圾回收
更快的获取对象
缺点:
没有抽象层,扩展困难
使用场景:
网站计数器,线程池
工厂模式:
多种支付方式的时候
策略模式:
一个业务多种实现方案,第一个方案由于异常无法处理的时候第二个方案去处理
观察者模式
当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新,下单后记录日志,发送短信,送积分
mysql:
索引类型有:
唯一索引,主键(聚集,聚簇)索引,非聚集索引,全文索引
优化:
select不要使用*
尽量减少子查询,用关联查询代替
in 的数据不能过多
不频繁修改的字段可以合理增加冗余字段
建立索引
避免全表扫描,比如:!= <>,对where字段进行表达式,函数,算数操作
能使用数字类型字段尽量使用,因为字段串数据库索引处理的时候会比较每一个字符,数字类型只需要比较一次
索引注意点:
模糊查询,%放第一个位置不生效
联合索引,带有第一个字段才会生效
or必须前后两列都是索引才生效
SpringCloud:
Eureka
服务注册于发现。
高可用,部分挂了,可以切到其它节点,可能会信息不一致
ZooKeeper
一致性,主挂了之后30多s会进行leader选举,此时不可用,会导致整个微服务停止
Feign
基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
Ribbon
实现负载均衡,从一个服务的多台机器中选择一台。
Hystrix
提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
Zuul
网关管理,由 Zuul 网关转发请求给对应的服务。
redis:
单线程的,轻松处理每秒几十万的请求
快:基于内存,数据结构简单,单线程(不用考虑锁,多线程切换而消耗cpu),多路I/O复用模型(多个网络连接复用一个线程)
支持的数据类型:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。
持久化:把内存的数据保存到磁盘
原因:
基于内存的数据库,容易丢失
rdb:
每隔一段时间或者key改变达到一定数量自动往磁盘保存一次
aof:
每执行一次命令就写入aof文件,如果数据丢失了就读取这个文件恢复数据
缓存穿透:查询一个不存在的数据结果为空,导致每次直接查询数据库。
解决方案:每次查询结果为空时也缓存1分钟。
缓存击穿:缓存过期,同一时间大量用户全部请求进入到数据库
解决方案:设置永不过期,加入互斥锁
缓存雪崩:缓存出现问题或者大批量缓存同时失效,全部请求进入数据库,导致服务挂掉
解决方案:哨兵模式集群模式高可用,限流或者熔断降级,缓存时间设置永不过期,不要设置同时失效
操作字符串的类有:
String、StringBuffer、StringBuilder的区别
String每次都会生成一个新的对象,其它都是在原有对象追加
StringBuffer线程安全,StringBuilder线程不安全,性能高
默认16,不够会自动进行扩容工作,扩展为原数组长度的2倍加2,创建一个新的数组,并将数组的数据复制到新数组。
悲观锁:数据库sql控制
乐观锁:版本号控制
cookie数据存放在客户的浏览器上,session数据放在服务器上
单个cookie在客户端的限制是3K
幂等性
定时任务
导出处理
消息队列:
为什么要使用:异步,分散服务器压力,解耦
重复消费:
使用数据库字段或者redis建立唯一键判断
消息丢失:
消费者接受消息之后告诉生产者
消息积压:
开启多个消费者或者多线程处理
关键字作用:
static:
修饰变量,修饰方法,静态块,静态内部类,静态导包,不会被序列化
为什么java中静态方法不能调用非静态方法和变量?
因为静态方法在类加载的时候就已经分配内存了,而非静态方法要在对象初始化之后才存在,然后通过类的对象去访问
volatile:
可见性,有序性(由于虚拟机可能会对代码重排序)
final:
基本类型:值无法修改
数据类型:对象地址的引用不能修改
类成员变量:必须赋值,否则报错
方法:无法重写,可以被继承
类:无法被继承
transient:
不会被序列化
synchronized:
jdk自带,非公平锁(不保证线程顺序),不能获取到锁,悲观锁,计数器+1阻塞,-1变为0释放
Lock:
java.uiti下面的接口,可以公平锁,可以获取到锁,可响应中断,需要手动释放,乐观锁cas+volatile
ArrayList:
查询快
LinkedList
插入,删除快
双向链表结构
HashMap:
线程不安全
数组+链表实现
HashMap无序,LinkedHashMap有序
关键字16,0.75,12,8,6,2
链表解决哈希冲突
put方法先判断hashcode相等,在判断equals
HashTable:
线程安全,synchronized锁整张hash表
ConcurrentHashMap:
数组加数组加链表
线程安全,分段锁实现,volatile让value具有可见性
HashSet:
基于HashMap实现
value为什么用对象不用null是因为:add方法返回的是一个boolean,为空返回true,而hashmap返回的是value
线程:
继承Thread重写run方法,因为单继承局限性不推荐
实现Runnable接口
实现Callable接口,有返回值
状态:
创建new、就绪start、运行run、阻塞sleep,死亡stop
属性:
编号(ID)
名称(Name)
线程类别(Daemon)
优先级(Priority
确定设置的线程数:
耗cpu的设置为:cpu个数+1,耗IO设置为:2倍cpu个数+1
线程池ExecutorService:
execute():只能执行 Runnable 类型的任务。
submit():可以执行 Runnable 和 Callable 类型的任务。
参数详解:
1.corePoolSize:线程池中的常驻核心线程数
2.maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于1,Runtime.getRuntime().availableProcessors() * 2 这个意思是处理器核心数*2
3.keepAliveTime:多余的空闲线程的存活时间,当空闲时间达到keepAliveTime值时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止。
4.unit:keepAliveTime的单位
5.workQueue:任务队列,被提交但尚未执行的任务
6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般用默认的即可
7.handIer:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)
拒绝策略:
1:直接报错,抛出异常
2:丢弃提交的线程
3:丢弃最老的一个线程
4:不会丢弃,谁提交任务谁执行
优点:
重用存在的线程,减少对象创建销毁的开销
有效控制最大并发数,避免过多资源竞争
mybaits工作原理:
加载配置文件
创建SqlSessionFactory会话工厂
返回SqlSession的实现类DefaultSqlSession对象
获取接口代理对象
执行sql语句
返回结果集
谈一下你在项目中解决过的比较复杂的问题
Aop设计:
说出5条IO的最佳实践
说出至少5点在Java中使用线程的最佳实践
实战能力
有没有处理过线上问题?出现内存泄露,CPU利用率标高,应用无响应时如何处理的。
开发中有没有遇到什么技术问题?如何解决的
如果有几十亿的白名单,每天白天需要高并发查询,晚上需要更新一次,如何设计这个功能。
新浪微博是如何实现把微博推给订阅者
Google是如何在一秒内把搜索结果返回给用户的。
12306网站的订票系统如何实现,如何保证不会票不被超卖。
如何实现一个秒杀系统,保证只有几位用户能买到某件商品。
软能力
如何学习一项新技术,比如如何学习Java的,重点学习什么
有关注哪些新的技术
工作任务非常多非常杂时如何处理
项目出现延迟如何处理
和同事的设计思路不一样怎么处理
如何保证开发质量
职业规划是什么?短期,长期目标是什么
团队的规划是什么
能介绍下从工作到现在自己的成长在那里