并行流底层实现和问题
底层使用forkjoinpool,默认线程数为核心数,拆分使用对半递归拆分。
问题,1.同用一个池子,线程数有限,如果有IO阻塞任务,将会导致其他任务长时间等待。
sql执行流程
连接-查询缓存-语法解析器和预处理-查询优化器-执行计划-执行SQL
连接:tcp连接,权限验证
查询缓存:根据query进行hash运算,存储结果
语法解析器和预处理:验证语法是否正确,库表字段是否存在
查询优化器:基于成本选择成本最小的语句
执行计划:生成查询的指令树
执行sql: 调用存储引擎的API进行查询
网络安全
https://www.cnblogs.com/pretty-sunshine/p/11442326.html
1.防止sql注入,使用ORM时避免sql拼接
mybatis使用#{}占位,而非${}
hibernate,使用?等占位,避免直接拼接
2.xss,插入网页脚本代码,盗取用户信息等。
转义字符,httponly防止cookie泄漏
3.csrf跨站请求伪造
检查Referer字段:发出请求的网址和被请求的网址必须一致。缺点:由浏览器保证
令牌同步模式:由服务端办法token。缺点,服务端生成(前后端不分离),且代价高
zookeeper注册中心使用
注重CP,网络分区时不可用,导致选主时无法扩容。
写不可扩容,大量集群时存在性能瓶颈。
http2.0
头部压缩:客户端和服务器加入头部缓存,增量更新。减少消耗。
二进制分帧:HTTP/2 数据通信的最小单位消息,一个消息由多个二进制帧组成。多个帧可以乱序发送,根据帧首部流标示组装
多路复用:代替原来的序列和阻塞机制。http1.1,并行请求靠多个tcp实现多流并行。2.0同域名只占用一个tcp连接,减少资源消耗。避免头阻塞。
服务器推送:主动推资源。服务端可以主动把JS和CSS文件推送给客户端,而不需要客户端解析HTML时再发送这些请求。
总结:HTTP/2的通过支持请求与响应的多路复用来减少延迟,通过压缩HTTP首部字段将协议开销降至最低,同时增加对请求优先级和服务器端推送的支持
object有哪些方法,为什么所有的类都继承,怎么继承的?重写equals方法需要注意什么
toString,hashcode,equals,wait,notify,notifyall,getclass,clone,finalize
jdk6之前通过编译器继承,之后通过jvm
自反性,对称性,传递性,一致性(多次结果相同),如果x!=null x.equals(null)为false
为什么Java是单继承?
单继承体系简单,避免棱形问题。
接口可以多继承,接口只是定义行为,继承者要自己实现具体方法。如果default方法重复,则子类要重写。
多态是做什么用的?
同一个接口,使用不同的实例执行操作有不同的表现
多态的必要条件:继承,重写,父类引用指向子类对象
多态的好处:对所有类的对象进行通用的处理
多态的实现原理:动态绑定,也叫后期绑定。
静态绑定与动态绑定
静态绑定发生在编译器,动态绑定发生在运行期。
使用private,static,final修饰的方法使用静态绑定,成员变量使用静态绑定,可以被子类重载的方法会根据运行时的对象进行动态绑定。
重载使用静态绑定,重写使用动态绑定。
动态绑定因需要查找对应的方法,更为耗时。
线程状态, 什么时候会争锁?
start,runnable,blocked,waiting,timed_waiting,terminated,
start:new thread之后进入start状态,此时还没有调用start()方法
runnable:调用start()方法后,进入runnable状态,waiting状态,timed_waiting状态的线程被唤醒或超时,进入runnable状态,blocked的线程获取到锁,进入runnable状态
waiting: wait()方法执行,join()方法执行,进入waiting状态
timed_waiting: wait(long),Thread.sleep(long),Thread.join(long)方法执行,进入超时等待状态
blocked: 等待进入sychronized代码块,进入blocked状态
terminated: 线程执行完毕,或main方法执行完毕
wait(),会释放锁,本线程进入等待队列,锁池内的线程进行争锁。
notify(),唤醒随机一个wait状态线程到锁池,待notify()线程执行完毕释放锁后,锁池内的线程进行争锁
sleep(long),不释放锁。进入timed_waiting状态
yield(),不释放锁,有运行状态,转为就绪状态。让os选择线程执行,有可能选到自己,从而无法达到让步的目的
thread.join()/join(long):不释放锁。
notify消费者无锁实现
blockingqueue
为什么要使用继承?继承的好处是什么?
优点:创建子类对象时,无须创建父类对象。
优点:子类自动继承父类的接口
缺点:子类缺乏独立性,依赖父类
缺点:不支持动态继承,子类在运行时不能选择父类。
缺点:扩展时,往往以增加系统结构复杂度为代价。
什么时候使用继承?什么时候使用组合?
除非使用多态,否则优先使用组合
类似实现多重继承时,使用组合
要实现多态,又要使用多重继承时,使用组合。
Bean生命周期
数据库间隙锁会导致死锁吗,问题
间隙锁非互斥锁,多个线程会同时请求到间隙锁,进而造成死锁。
间隙锁的目的是防止幻读,通过以下两个方面:
1.防止间隙内有数据插入,2.防止已存在的数据修改为间隙内数据
间隙锁的条件:1.必须可重复度隔级别下,2,必须使用索引。
间隙锁锁的范围,间隙锁是前开后开的,next-key是前开后闭的,加锁流程如下:
1.首先加前开后闭( ]
2.如果是唯一索引等值查找,退化为记录锁
3.如果是非唯一索引等值查找,且查找的的值不等于锁最右值时,退化为前开后开间隙锁
如,id 1,4,5,查id=3,则锁(1,4)
多列索引命中第一个大于符号时,type类型,all
不走索引的情况
1.不使用左前缀
2.类型转换
3.使用函数计算
4.使用不等式
5.索引区分度过低
6.使用了is null ,not null
CAS ABA问题处理
加版本号,java 自带实现:AtomicStampedReference atomicStampedRef
atomicStampedRef.compareAndSet(100, 101, atomicStampedRef.getStamp(), atomicStampedRef.getStamp() + 1);
uuid和自增主键的区别和应用场景?
uuid,自增id(每台机器不同起始值),雪花算法,redis
自增id与uuid的比较
自增id,优点:查询效率高,范围查询容易,存储空间小;缺点:安全性低,数量有限(数十亿,bitint可以更大)
uuid,优点:适合大量数据插入,安全性高。缺点,储存空间大,无序,性能低。
雪花算法:时间戳 + 工作机器id + 序列,大致有序(单机递增)
gcroot根节点有哪些?
栈中引用的对象,本地方法栈中引用的对象,元空间中静态变量和常量引用的对象。
spring 事务传播机制,catch 后的回滚事情
默认传播机制,required,只有一个事务,catch后不会滚
redis 热键问题,数据不一致问题
热键问题办法:1.客户端缓存到本地,2.将热键拆成多个相同value的子健,使热点分散
redis 事务存在的问题
1.不支持rollback;2.
redis 锁的实现,lua+hash(锁名hashkey+线程idfield+重入次数value)+看门狗
大键阻塞如何快速定位?
memory usage 查找大key
slowlog n 查看慢查询日志
unlink代替del 后台异步删除
redis 内存占满怎么处理
RDB持久化 save bgsave都不会把过期键保存到RDB当中,达到删除过期的效果。
载入RDB时,master不载入过期键,slave载入过期键。slave不会主动删除过期键,等主发来del命令
AOF重写,rewriteaof/bgrewriteaof 会过滤过期键
接口幂等实现?
1.redis+token,先申请token,写入到redis,写的时候先查token,如存在先删token并继续操作。如执行业务失败,调用方需重新获取token
问题,增加大量无用的token请求.
2.防重表:使用mysql 多列组成唯一索引形成校验表,序列号,类型,备注等,先插入防重表,成功则继续。
2.乐观锁机制:请求时加上version版本号,并递增。如set version=version+1 where version=1;
拒绝策略不允许丢弃任务的场景, 线程池拒绝策略的各种特点及应用
直接丢弃DiscardPolicy,丢弃最老的DiscardOldestPolicy,抛异常AbortPolicy,使用调用者线程执行CallerRunsPolicy
多列索引or优化
单个key 用in 多个key 用union
mysql limit 优化
limit 10000,2会先查前10000然后在抛弃掉,造成性能低下,优化方案如下,
1.通过主键id,记录上次查询id,直接》limit 操作
select * from xx where id>1000000 limit 10;
2.不知道上次主键id
可优化为 from xx where id>=(select id from xxx limit 10000,1) as tmp limit 2;
3.有其他过滤条件
select * from (select id from a where age<33 limit 1000000,10) tmp inner join a on a.id=tmp.id ;
对age建索引,通过age,id的覆盖索引减少回表。