面试题https://www.cnblogs.com/javastack/p/9546015.html
https://blog.csdn.net/u014664750/article/details/78980133
JAVA中的几种基本数据类型是什么,各自占用多少字节。
https://www.cnblogs.com/spenserliu/p/9850232.html
String类能被继承吗,为什么。
https://blog.csdn.net/zhangyubishoulin/article/details/82459855
String,Stringbuffer,StringBuilder的区别。
https://blog.csdn.net/kingzone_2008/article/details/9220691
ArrayList和LinkedList有什么区别。
https://blog.csdn.net/weixin_42468526/article/details/81178698
IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。
https://www.cnblogs.com/xuxiuxiu/p/7798136.html
代理 静态代理 动态代理(InvocationHandler 重写invoke()) cglib代理(MethodInterceptor重写intercept)
https://www.cnblogs.com/cenyu/p/6289209.html
什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。
java8的新特性。
🐴🐴🐴
🐴🐴🐴docker启动redis 集群
https://segmentfault.com/a/1190000010131816
🐴🐴🐴缓存击穿/雪崩/穿透
https://baijiahao.baidu.com/s?id=1655304940308056733&wfr=spider&for=pc
🐴🐴🐴sql优化过程
https://blog.csdn.net/m_nanle_xiaobudiu/article/details/79288257
🐴🐴🐴jvm调优思路
https://baijiahao.baidu.com/s?id=1617167971312758600&wfr=spider&for=pc
https://www.jianshu.com/p/b92b08706a12
https://blog.csdn.net/b1303110335/article/details/104877029
🐴🐴🐴JVM基本参数
https://blog.csdn.net/Andy86869/article/details/83217169
慕课网 剑指offer java面试复习
🐴🐴🐴tcp3次握手/4次挥手
🐴🐴🐴4次挥手 timewait状态/close_wait过多原因
https://blog.csdn.net/qq_40910541/article/details/88677656
https://www.cnblogs.com/softidea/p/5741192.html
TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。
因为TIME_WAIT状态持续2MSL,
🐴🐴🐴tcp syn flood 攻击
https://blog.csdn.net/xiyou222/article/details/51285562
https://www.cnblogs.com/jokerbj/p/11278067.html
A(攻击者)发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当这个服务器返回ACK以后,A不再进行确认,那这个连接就处在了一个挂起的状态,也就是半连接的意思,那么服务器收不到再确认的一个消息,还会重复发送ACK给A。这样一来就会更加浪费服务器的资源。A就对服务器发送非法大量的这种TCP连接,由于每一个都没法完成握手的机制,所以它就会消耗服务器的内存最后可能导致服务器死机,就无法正常工作了。更进一步说,如果这些半连接的握手请求是恶意程序发出,并且持续不断,那么就会导致服务端较长时间内丧失服务功能——这样就形成了DoS攻击。这种攻击方式就称为SYN泛洪攻击。
那么我们如何去防范这种SYN攻击呢?
其实最常用的一个手段就是优化主机系统设置。比如降低SYN timeout时间,使得主机尽快释放半连接的占用或者采用SYN cookie设置,如果短时间内收到了某个IP的重复SYN请求,我们就认为受到了攻击。我们合理的采用防火墙设置等外部网络也可以进行拦截。
🐴🐴🐴HTTP HTTPS区别
https://www.cnblogs.com/jesse131/p/9080925.html
🐴🐴🐴HTTPS 握手
https://www.jianshu.com/p/14cd2c9d2cd2
https://blog.csdn.net/jasonjwl/article/details/50985271
🐴🐴🐴IPV4 IPV6
https://blog.csdn.net/chao199512/article/details/86139714
🐴🐴🐴TCP和UDP的区别
https://www.jianshu.com/p/8cb4b1f2afb3
https://blog.csdn.net/xiaoyuerp/article/details/84102318.
🐴🐴🐴TCP滑动窗口
保证tcp可靠性(批量发送 按序列重排)
流量控制(接收方告诉发送方 接收方的能力)
🐴🐴🐴HTTP请求/响应结构.
🐴🐴🐴HTTP请求过程
🐴🐴🐴HTTP状态码
1已接受
2成功3重定向4客户端错误5服务器错误
🐴🐴🐴HTTP GET POST区别
GET URL拼接参数 长度限制 POST 参数放在请求体body中
GET 幂等性 安全性 GET会被缓存/储存
🐴🐴🐴HTTP COOKIE SESSION 让http具有状态
COOKIE 客户端用户信息
SESSION 服务器端信息 服务器分发cookie jsessionid/url回写jesessionid参数
session更安全/但占用服务器性能
🐴🐴🐴加密方式
对称加密 加密解密公用一个key 效率高 DES 3DES AES
非对称加密 加密解密分别使用公钥私钥 安全性高 效率高 加密长度有限 RSA、DSA(数字签名用)、ECC(移动设备用)
哈希算法 将信息转为固定长度值 不可逆 MD5
数字签名 信息添加签名哈希值 确保数据没被修改
🐴🐴🐴HTTPS加密流程
不用每次都非对称,第一次非对称传送对称加密的密钥,之后使用对称加密,避免性能问题。
🐴🐴🐴HTTPS HTTP区别
🐴🐴🐴为何要四次分手呢?
那四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
**
数据库
**
🐴🐴🐴数据库模块设计
🐴🐴🐴索引数据结构
🐴🐴🐴为什么使用索引
因为要避免全表扫描 提升查找效率
🐴🐴🐴二叉查找树 平衡二叉树(相差不大于1)
二分查找法 O(log n)
缺点 增加删除后成为线性树
🐴🐴🐴B树 有M个孩子就是M届B树
定义:每个最多M个孩子 最少有MAX(M/2)个孩子 叶子节点位于同一层(矮 减少io)
因为定义所以不会形成线性树
🐴🐴🐴B+树
特点
优点:
1树更矮 io更低 树结构只存索引(可以存更多索引)
2效率更稳定 任何查找要从根节点到叶子节点
3扫描效率更高 因为数据项链
🐴🐴🐴HASH索引 速度快
缺点:不能使用范围查询 数据仍需排序
不能使用组合索引
不能避免表扫描 bucket对应多个数据 需要扫描
hash撞桶 性能低下(不稳定)
🐴🐴🐴BITMAP索引 存储空间小
适合 固定索引 性别 颜色 等
修改一个需要锁表
🐴🐴🐴密集/稀疏索引
MYSQL INNODB MYISAMDB
密集索引 物理排列顺序 索引都对应一个数据记录 以及其他列的信息 索引数据 一起存储
稀疏 对应多个 地址 及主键 索引数据 分开存储
🐴🐴🐴SQL优化
1打开慢日志
2explain 语句分析
index all为全表扫描
3修改sql语句 select 索引位 或添加索引/使用适合的索引(mysql有查询优化器会选择 但不一定是最优 需测试)
force index(xxx)强制使用xx索引
修改前
修改后
🐴🐴🐴联合索引 最左匹配原则
建立联合索引area title
条件为2者时 走联合索引 为area走 为title不走
原则为
成因 从col3开始找 col2 col1 但不能直接找 12
🐴🐴🐴索引越多越好? 否定
🐴🐴🐴INNODB /MYISAM 锁方面的区别是什么
MYISAM 支持表级锁 不支持行级锁 // INNODB同时支持
MYISAM select的时候会对表+读锁 update insert会对表上写锁 会阻塞
lock tables xxx read;上读锁(共享锁) 解锁unlock tables;
🐴🐴🐴MYISAM 表锁与索引无关 (检索性能高)
https://blog.csdn.net/fei33423/article/details/72229677 为什么检索性能高
select语句默认 共享锁 update insert默认排他锁
上读锁时 依然可以读 不能排他锁
上写锁(排他锁)时 读/写都被阻塞
select 语句上排他锁 for update;
🐴🐴🐴INNODB 可以提交事务 事务二段锁 行锁(走索引)表锁(不走索引)(读写性能高)
事务默认自动提交 autocommit ON
select并未上共享锁
上共享锁 (共享锁之后还可以执行其他锁)
共享排他规则相同
x排他 s共享锁
🐴🐴🐴MYISAM/INNODB 对比
行锁代价大 开销大
MYISAM 适合检索(效率高) 保存了count数量(count快)
不适合增删改(会锁表) 没有事务
INNODB 适合修改(只锁行 效率高) 可靠性高(支持事务)
🐴🐴🐴MYSQL各种锁
乐观锁 可以任意修改(修改之前取版本号) 在提交更新时比对数据版本(相同则更新/不相同失败)(1版本号2时间戳) 冲突则返回失败
悲观锁:全程在数据库层 排他锁实现(数据安全)(死锁 降低并行 效率低)
数据库事务
🐴🐴🐴事务的4大特性ACID
A原子性(要么全做 要么全失败)C一致性 I隔离性(多个事务 事务之间互不影响)D持久性(事务永久更改 更新不能丢失 系统故障也不能影响 INNODB为redo log file)
🐴🐴🐴事务并发引起的问题
🐴🐴事务更新丢失(innodb避免)
🐴🐴脏读
事务一操作后回滚
事务2 读到事务回滚前的脏数据 进行修改
解决办法:set session TRANSACTION ISOLATION LEVEL READ COMMITTED;//只读事务提交完的结果
🐴🐴不可重复读
事务一 第一次读 数据为事务2提交之前的数据
第二次读 数据为事务2提交之后的数据 2次读的数据不同
set session TRANSACTION ISOLATION LEVEL REPEATABLE READ;//设置隔离级别为 可重复读
🐴🐴幻读 (read commited 隔离级别出现)
事务一 读表数据 事务2新增或删除表数据 (均为提交)
事务一修改表数据 连带了新增/减少的那行
解决:set session TRANSACTION ISOLATION LEVEL SERIALIZABLE;//隔离级别最高(所有sql执行都会上锁) 会让事务2的新增阻塞
🐴🐴🐴事务隔离级别
mysql
select @@tx_isolation; 8.0为select @@transaction_isolation;
set session TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;//innodb可以读事务未提交的修改
🐴🐴🐴当前读 快照读
🐴🐴🐴RR/RC 快照读如何实现的
rr隔离级别下(原因为READ VIEW产生版本)
事务1 快照读300 事务2修改为0提交 事务1快照读还为300 事务1当前读为0
事务1 事务2修改为0提交 事务1快照读还为0 事务1当前读为0
RC隔离级别下 当前度 快照读都相同
原因:伪MVCC(多版本并发控制 读不加锁 读写不冲突)每行加入了3个字段
介绍和MVCC有关的字段:DATA_TRX_ID和DATA_ROLL_PTR。
DATA_TRX_ID:(最后一次修改的事务id)用来标识最近一次对本行记录做修改(insert|update)的事务的标识符, 即最后一次修改(insert|update)本行记录的事务id。
DATA_ROLL_PTR:(回滚指针)指写入回滚段(rollback segment)的 undo log record (撤销日志记录记录)。如果一行记录被更新, 则 undo log record 包含 ‘重建该行记录被更新之前内容’ 所必须的信息。
DB_ROW_ID 行号 随新行插入 而增的id
UNDO LOG 进行操作就会产生undo记录 老版本数据 (旧的数据 在undo日志中找她的版本数据)
undolog 分为 insert/update undo log(delete/update产生的log 回滚/快照读都需要)
READ VIEW 可见性
快照读时 会创建READ VIEW 可见性算法 对比DB_TRX_ID事务id与活跃事务id(最大最小 递增) 取出undo log
🐴🐴🐴RR下next-key锁 行锁 gap锁(防止幻读的发生 区间锁)
gap锁 rr 串行中才有
删改查
全部命中(where in 记录全能找到)不用gap锁 用记录锁record lock
部分命中 或未命中 区间上gap锁
REDIS
🐴🐴🐴redis多路复用选择
https://www.cnblogs.com/linganxiong/p/5583415.html
REDIS 主线程为单线程去操作 都为原子性操作
IO 多系统先选择O(1)的底层函数 ,没有则选择select()
🐴🐴🐴redis数据结构
🐴🐴🐴查找固定pattern的key
KEYS +PATTERN 缺点
SCAN+PATTERN+COUNT 可用在生产环境
🐴🐴🐴REDIS分布式锁
1setnx key之后再expirekey
如果设置成功则操作 不成功则等待
缺点:setnx和expire 两个动作并非一起原子性
2直接set 带上NX 和expire时间
🐴🐴🐴大量key在同时过期 造成卡顿
🐴🐴🐴REDIS做异步队列
初级
代替sleep机制 采用redis的 blpop 阻塞等待 pop
redis pub/sub模式 多个消费者消费消息
缺点 无状态 不保证可达(使用mq)
🐴🐴🐴redis持久化 3种
RDB 快照 手动触发
缺点:
自动触发
🐴🐴🐴BGSAVE 底层
调用fork创建子进程去写rdb 互不影响主进程 主进程如果要写 会在副本上写 互不影响 实现原子性 copy on write
🐴🐴🐴AOF append only file 追加 保存写状态 备份数据库接收到的指令
🐴🐴🐴AOF文件重写压缩 BG REWRITE AOF手动触发
🐴🐴🐴数据恢复 REDIS服务器启动时 直接加载aof 无则加载rdb
🐴🐴🐴RDB AOF 优缺点
🐴🐴🐴混合方式 RDB全量备份 AOF 追加RDB之后的改动 4.0之后
🐴🐴🐴redis pipeline batch执行命令 不用单条执行 单条响应
🐴🐴🐴主从同步 弊端 确保高可用
最终一致性 主写 从读 一个从保存修改 再通知主 将修改同步到从
全同步
增量同步 主先整理aof改动 在从写入改动
🐴🐴🐴redis sentinel哨兵高可用 流言协议-接受主状态信息 投票选新主
🐴🐴流言协议
🐴🐴主从同步设置
https://blog.csdn.net/qq_41782425/article/details/89287723
哨兵配置
https://blog.csdn.net/weixin_40671802/article/details/80798537
🐴🐴redis集群 一致性哈希算法 容错性 扩展性 解决高并发
数据分片
采用哈希环去定位 服务器位置 以及 数据位置 1-2^32
优点:宕机 影响数据少 好扩展
缺点:服务器较少时 数据倾斜
解决:服务器虚拟节点 每个服务器多个节点
redis集群设置https://my.oschina.net/ruoli/blog/2252393