一问一答之mysql
说说三大范式个人怎么理解的?第一范式:每列不可再分
第二范式:在第一范式基础上,非主键列全部依赖于主键(可以接受冗余)
第三范式:在第二范式基础上,不依赖其他非主键,也就是消除冗余。比如用户表一个人的id作为主键,部门名称就违反了3NF,因为部门名称依赖于部门id,不完全依赖于id
一般满足3NF就可以了,根据业务的不同来适当进行字段冗余,减少表之间的连接,减少IO,提高查询效率
innodb的聚集索引与非聚集索引聚集索引:表记录顺序与索引记录顺序一致。找到了索引就相当于找到了数据。所以一般来说主键就是非聚集索引:不一致,找到索引没找到数据,根据索引上的指在回表查询
非聚集举例:select no,name from student where no = ‘test’。查到no的主键,再根据主键查一次
对innodb了解吗innodb底层结构使用B+树为什么不用红黑树或者AVL?因为是二叉树的变种,而B树是多叉树,一个节点能存更多的信息,所以在相同的数据下,树的高度更低,IO次数更少为什么不用B树?B+的非叶子节点不存数据,在相同数据下,高度更低,IO更少
聚集索引特点
聚集索引只 ...
一问一答之基础
参照这篇文章
Java部分数据类型基本数据和引用数据
基本有8种按占用内存分别为,byte(1),boolean(1),short(2),char(2),int(4),float(4),long(8),double(8)
访问权限
反射应用场景
框架(spring通过xml装载bean)
jdbc
BeanUtils.copyPropeties
OSI模型
三次握手一句话:确保双方的一个收发数据的能力
A发给B,B收到了,B知道了自己的的收数据能力和A的发数据能力是可以的
B发给A,A收到了,A知道了B的发数据与自己的收数据能力
而此时B还不知道自己的发件和A的收件能力,所以A还会给B再发送一次
总之就是AB都需要确保四点,我的发送,我的接收,他的发送,他的接收
为什么是4次挥手3次只是表明我同意你关闭连接了,但还不确定是否还有剩余的数据需要发送
说说ArrayList的扩容ArrayList底层由数组实现,默认容量10,初始为一个空数组,在添加元素的时候才会为其扩容,即扩为10。如果容量不够,则会触发grow()进行扩容,grow是扩容的核心方法,将新容量扩为之前的1.5倍
12 ...
一问一答之并发编程
前言详细见juc笔记
并发和并行的区别
并发有同时处理任务的能力,不一定是同时(cpu时间片交替执行,逻辑上看着是同时,实则不是,使用的一个cpu核心)
并行是可以同时处理任务(真正的多核运行)
谈谈进程和线程的区别
进程是资源分配的最小单位,每个进程都有自己的资源和内存空间,但切换时会有比较大的开销
为了提高切换效率,减少调度时间,就出现了线程,它是程序执行的最小单位,一个进程通常包含多个线程
谈谈CASunsafe类下面的一个方法。全称是(compare and swap)比较并交换,可以保证在多线程的的一个环境下对共享变量的修改保证一个原子性。
比如做一个累加操作,需要从主内存中取出做操作,再将内存中的值写回主内存中,多个线程对同一个共享变量做操作,会出现原子性的问题,这个过程可以使用锁来解决,但性能会变差,CAS会把这个共享变量的旧值和期望值进行比较,如果符合则进行更新
CAS的底层原理怎么实现的?通过unsafe类实现,是硬件级别的操作,通过OS实现原子性,C++源码中使用cmpxchg来实现,底层会调用lock if mp(多核)如果是多核则加锁
CAS的缺点?
...
一问一答之数据结构
说说跳表跳表 = 链表 + 多级索引(空间换时间,复杂度为klogn,k为每个几个节点简历一次索引,常数项忽略,那就是logn)允许快速查询,给链表增加索引,查找数据首先在索引层进行遍历,相当于在一个范围内查找,索引层可以多层
一问一答之项目
项目的难点一个单线程web应用,没有spirng对内部的一个调优,且数据库版本较低,当并发数到达一定量的时候,经常会造成线程阻塞的情况
项目代码4 — 数据库2 — jvm1 — 操作系统0
在脱离框架后是否可以使用原生技术解决问题—使用HttpUrlConnection来获取IO流,根据流在获取文件(MultipartFile)
设计模式重构,部分请求在通过并发的方式处理,修改代码减少for循环次数,适度跳出
流程页面使用页面静态化提高用户访问速度
将模块抽离,使用spring构建新模块,采取前后端分离的方式
排除sql语句是否使用了索引(定位慢sql),数据库是否建立了合适的索引
用缓存来减少数据库的压力 用缓存来减少数据库的压力
调整jvm堆内存大小
如何设计一个秒杀系统秒杀系统就是一个“三高”系统,即高并发、高性能和高可用的分布式系统秒杀设计原则:前台请求尽量少,后台数据尽量少,调用链路尽量短,尽量不要有单点秒杀高并发方法:访问拦截、分流、动静分离秒杀数据方法:减库存策略、热点、异步、限流降级访问拦截主要思路:通过CDN和缓存技术,尽量把访问拦截在离用户更近的层,尽可能地过 ...
Autowired用法案例
使用前提
在spring容器中
在包扫描路径下
使用场景该注解主要用于创建对象(比较常用的就是CRUD操作)
测试结构1234567src.main ├── java.com.auto.test // 启动类│ └── Base.java // 父接口│ └── Dog.java // 子类1│ └── Cat.java // 子类2│ └── MyComponent.java // 自定义├── test.java.auto // 测试类
测试子类及结论先证明@Autowired发挥作用
1234// 父类public interface Base {void eat();}
12345678// 子类1@Componentpublic class Cat implements Base { @Override public void eat() { ...
微服务笔记
SpringCloud是什么微服务一站式解决方案
Nacos是什么
服务发现、配置管理、服务管理平台
注册中心 + 配置中心
AP(高可用 + 分区容错)或CP(强一致性 + 分区容错)可以来回切换
存信息AP,经常访问CP
与ZK的区别
ZK是CP(强一致性 + 分区容错)
没有控制台,社区没有nacos活跃
读写分离将读与写分别放于不同的服务器上,主写从读。一主一从或一主多从,适合单机并发读比较多的场景
如何解决分离后带来的同步问题解决了性能问题,如何保证数据一致性,主库同步从库需要时间,如何解决?
读主库,虽然增加压力,但也有效
延迟读取
如何实现
部署多台数据库
进行主从复制
主写从读
在请求之后加入代理层,用来分发请求。官方的中间件为MySQL Router
或者使用sharding-jdbc,引入jar包使用,空降点我
什么是主从复制?MySQL 主从复制是依赖于 binlog 。另外,常见的一些同步 MySQL 数据到其他数据源的工具(比如 canal)的底层一般也是依赖 binlog 。
分库分表用来解决数据量大造成的性能问题
sharding-jdbc是常见 ...
JUC笔记
什么是JUCjava.util.concurrent工具包的简称,处理线程的一个工具包
进程资源分配的最小单位,在系统中运行的一个应用程序,每个进程都有自己的内存空间和系统资源
线程程序执行的最小单位,一个进程包含多个线程。程序调度的基本单元。线程分为用户线程(默认线程)和守护线程。用户线程会完成程序的业务操作守护线程做一些默默的事情比如GC。用户线程全部结束则守护线程结束
管程monitor监视器,也就是锁(synchronized),方法调用如果有synchronized,执行线程前首先要成功持有管程。在方法执行期间,只有管程的线程,其他任何线程都无法获取到同一个管程。
线程状态
新建、就绪、阻塞、等待1、等待2、终结
waiting(不见不散—不来就一直等)
timed_waiting(过时不候)
wait和sleep1、sleep是Thread的静态方法,wait是object方法,任何对象都能调用
2、sleep不会释放锁,也不占用锁。wait会释放锁,前提是先占用锁(代码在synchronized中)
3、都可以被interrupted方法中断
并发和并行并发:有同时处理多 ...