https://blog.csdn.net/luomao2012/article/details/122445060
springcloud常用组件
一共有7个:
注册中心:Eureka、nocits
熔断器
路由
Feign远程调用
配置中心
消息总线
网关
springboot的常用注解
@RestCollection
@SpringBootApplication
@MapperCan
@Service
@Autowired
@Transaction
@RequestBody
@ResponseBody
@RequsetParm
@Bean
@Configuration
@EnableAutoConfiguration
@RequestMapping
@Conponent
@ComponentScan
springmvc和springboot的关系
SpringMVC是集合了stuts2和Spring的整合
是web层的mvc框架代替了servlet
SpringBoot是一个微服务框架延续了spring的AOP和IOC简化了应用的开发和部署
使用SpringBoot是简化创建,运行,调试,部署
嵌入了Tomcat
绝对没有代码生成和xml编写
谈谈对spring的理解
spring是一个开源容器框架,可以接管web层、业务层、dao层、持久层的组件,冰鞋可以配置各种bean和维护bean与bean之间的关系
核心就是IOC控制反转和AOP切面编程,简单来说就是一个分层的轻量级开源框架
spring的ioc、di、aop分别是什么,ioc和di有什么关系
IOC是一设计模式,是一种思想,相当于容器
DI:
依赖注入 :
构造器注入
属性注入
方法注入
AOP是切面编程 完善了Spring的依赖注入DI
什么是事务
事务一般是指要做的和正在做的事情
事务的四大特性和隔离级别
事务有四大特性:
原子性:一个事务中的操作,要么都做,要么都不做
隔离性:一个事务的执行不能被其他事务干扰
一致性:如果有两个数据源,那么提交了事务就要保证这两个事务的一致性
持久性:持久性也称为永久性,一旦提交了事务,那儿么这个数据改变就是永久的,不可逆转的
悲观锁和乐观锁的区别和应用场景
乐观锁:每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会进行加锁,但是在更新数据的时候需要判断该数据是否被别人修改过,如果数据被其他线程修改,则不进行数据更新,如果数据没有被其他线程修改,则进行数据更新,由于数据没有进行加锁,期间该数据可以被其他线程进行读写操作。
悲观锁: 每次获取数据的时候,都会担心数据被修改,所以每次获取数据的时候都会进行加锁,确保在自己使用的过程中数据不会被人修改,使用完成后进行数据解锁,由于数据进行加锁,期间对该数据进行读写的其他线程都会进行等待
应用场景:
悲观锁:比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量
乐观送:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量
redis的数据类型,持久化方式
Redis中最基本的数据存储结构都是以string作为基础去存储的
String: 字符串,应用场景,登陆验证码
Hash : 应用场景:保存用户信息:Token
List:特点:用来存储多个有序的字符串,每个字符串又称为元素,优点:列表是一种比较灵活的数据结构,应用场景;可以简单模拟消息队列
Set :特点:用来保存多个字符串,但是和列表不同的是set不允许有重复的元素,并且集合中的元素都是无序的,redis除了支持集合的增删查改之外,还提供了多个集合交集、并集、差集。应用场景:在项目中上传图片功能中,将上传的图片地址保存在redis的set集合中,通过set集合可以计算差集、判断垃圾图片、定时清理垃圾图片
zset (有序集合)
特点:保留了set集合的特性,但是zset集合是可以排序的,但是和列表的索引是不一样的,zset给每个元素设置一个分数score,按照分数进行排序,列表的索引是不可重复的,但是zset的分数数可以重复的
应用场景:排行榜、视频播放量、点赞数等等

redis中过期键的删除策略:
1.定时删除:在设置键的过期时间的同时,创建一个定时器,当键在过期时间的时候自动删除该键
2.惰性删除:放任过期时间不管,每次从redis中获取该键的时候,都会检查该键是否过期,如果过期了就是删除,去过过期就返回该键
3.定期删除:每一段时间检查一次、即使键已经过期,但是还没有到定期检查的时间,也不会删除键,到了定期时间,程序就会检查所有的键是否过期,将已过期的键删除
redis持久化机制
redis有两种持久化机制,RDB和AOF
RDB持久化机制:通过数据集快照的方式,在某个时间点,将redis中所有的键值对写入一个临时文件,持久化结束之后,用这个临时文件替换上次持久化的文件,达到数据恢复的效果
优点:
1.只有一个rdb文件,方便持久化
2.容灾性好,一个文件可以安全的保存到磁盘
3.性能最大化,使用子进程来完成写的操作,而主进程继续处理命令,所以IO最大化,保证了redis的高性能
4.数据集较大的时候,比ADF启动效率高
缺点:
数据安全性低(RDB是间隔一段时间才进行持久化,如果在此期间,redis发生故障,会导致数据丢失,所以这种方式更适合对数据要求不严谨的时候使用)
适用场景:
适用于对数据要求不是很严谨的时候使用
AOF持久化方式:所有的命令记录以redis命令请求协议的格式持久化保存为aof文件
优点:
1.数据安全,配置appendfsync属性实现持久化,每进行一次命令操作,都会记录到aop文件中一次
2.通过append方式写入文件,及时redis宕机,也可以redis-check-aof工具解决数据一致性问题
缺点:
1.AOF文件比ROB文件大,恢复速度慢
2.数据集较大的时候,比RDB启动效率低
适用场景:
使用于对数据要求比较高的时候使用
redis缓存穿透、雪崩、击穿
缓存击穿:
redis中的一个key过期了,同一个key的请求过多,同一时间打到数据库上,就会造成缓存击穿
雪崩:
redis中的多个key过期了,多个请求打到redis上,就会遭成雪崩
击穿:
redis和数据库中没有的key,打到数据库上就是击穿
java的基本数据类型
一共八个基本数据类型
int
double
short
flort
boolean
char
long
byte
arraylist和linkedlist
arraylist:
采用数组结构:增删快,查询慢
linkedlist:
采用链表结构:增删慢,查询快
hashtable和hashmap
1.作者不同
2.产生时间不同:hashtable发型于jdk1.0,hashmap发行与jdk1.2
3.线程安全不同:hashtable在多线程下不用考虑死锁问题,在底层实现。hashmap在多线程下会出现死锁问题,需要处理
4.hashtable不允许出现key和value为null值,key为null会报空指针异常,因为底层用了key调用方法,value为null时,底层判断了是否为null,为null抛出异常
hashmap允许出现一个key为null的值,多个value为null的值。get方法直接取出
5.对外提供的接口不同
6.父类不同:hashtable的父类是:dictionary ; hashmap的父类是:abstractMap
7.遍历方式内部实现不同
8.初始容量大小和每次扩充容量大小不同:hashtable初始化容量是11,每次扩容 是 2n+1; hashmap初始化容量是16,每次扩容是是2n
9.计算hash值的方法不同
jvm内存溢出
1.java堆溢出:只要不断new 对象,并且避开垃圾回收机制,就会导致java堆内存溢出
2.虚拟机栈和本地方法栈溢出
在单个线程下,无论是栈帧太大,还是虚拟机栈内存太小,都会导致内存溢出
在多个线程下,无法取消多线程和更换64位虚拟机时,只能通过减少栈帧和减少最大堆来换取更多的线程
3.方法区和运行时常量池溢出
4.本机内存直接溢出
jvm调优
JVM调优目标:使用较小的内存占用来获得较高的吞吐量或者较低的延迟
程序在上线前的测试或运行中有时会出现一些大大小小的JVM问题,比如cpu load 过高、请求延迟、tps降低等,甚至出现内存泄露(每次垃圾收集使用的时间越来越长,垃圾收集频率越来越高,每次垃圾收集清理掉的垃圾数据越来越少)、内存溢出导致系统崩溃,因此需要对JVM进行调优,使得程序在正常运行的前提下,获得更高的用户体验和运行效率。
这里有几个比较重要的指标:
内存占用:程序正常运行需要的内存大小
延迟:由于垃圾收集而引起的程序停顿时间
吞吐量:用户程序运行时间占用户程序和垃圾收集占用总时间的对值
当然,和CAP原则一样,同时满足一个程序内存占用小、延迟低、高吞吐量是不可能的,程序的目标不同,调优时所考虑的方向也不同,在调优之前,必须要结合实际场景,有明确的优化目标,找到性能瓶颈,对瓶颈有针对性的优化,最后进行测试,通过各种监控工具确认调优或的结果是否符合目标
JVM调优工具:
调优可以依赖,参考的数据有系统运行日志、堆栈错误信息、gc日志、线程快照、堆转储快照等,
系统运行日志:系统优化日志就是在程序代码中打印出的日志、描述了代码级别的系统运行轨迹(执行的方法、入参、返回值等),一般系统出现问题,系统运行日志是首先要查看的日志
堆栈错误信息:当系统出现异常后,可以根据堆栈信息初步定位问题所在,比如根据“java.lang.OutOfMemoryError;java.heep.space”可以判断是堆内存溢出;根据“java.lang.StackOverflowErroe”可以-判断是栈溢出“java.lang.OutOfMemoryError;ParmGenspace”可以判断是方法区溢出等
GC日志:程序启动时用-XX:+OrintGCDetails和-Xloggc/data/jvm/gc.log 可以在程序运行时把gc的详细过程记录下来,或者直接配置“-verbose:gc”参数把gc日志打印到控制台,通过记录的gc日志可以分析每块内存区域gc的频率、时间等,从而发现问题,进行针对性的优化
线程快照:顾名思义,根据线程快照可以看到线程在某一时刻的状态,当系统中可能存在请求超时、死循环、死锁等情况时,可以根据线程快照来进一步确认问题。通过执行虚拟机自带的“jstackpid”命令,可以dump出当前进程中的快照信息,更详细的使用和分析网上有hen’duo’l
创建线程的方式
线程池有几种
mysql的引擎有几种
两种引擎:
InnoDB
MyISAM
项目中有没有设计表,都有哪些字段
sql优化
eureka和nacos的区别
项目中用到什么设计模式,单例有几种
SpringMVC的执行流程
mybatis的$和#
mybatis一级缓存和二级缓存的区别
为什么要用es,es的倒排索引是什么
rabiitmq的模式有几种
单点登录有状态和无状态的区别
双亲委派机制
spring中@Autowired和@Resource的区别
mysql底层数据结构
BTree和B+Treee的区别
hash的实现原理
