ORM 对象关系映射
把对象和表关系起来
全ORM 全自动化框架,不需要SQL语句
重载之中大多时候用参数少的调用参数多的
五大约束
主键约束(非空 且 唯一) primay key coustraint
外键约束 Foreign Key Counstraint
非空约束 not null
唯一性约束 unique
检查约束
Mybatis是一款半自动的ORM持久层框架,具有较高的灵活性,支持高级映射(一对一,一对多)
什么是ORM,对象关系映射。对象指的是java对象,关系值得是数据库中的关系模型,对象关系映射,指的就是在Java对象和数据库的关系模型之间建立一种对应关系,比如用一个Java的Student类,去对应数据库中的一张student表,类中的属性和表中的列一一对应。Student类就对应student表,一个Student对象就对应student表中的一行数据
Mybatis进行开发,需要手动编写SQL语句。而全自动的ORM框架,如hibernate,则不需要编写SQL语句
MYBatis 一级缓存,二级缓存
第一次查询之后,会缓存数据,不需要再查一遍
MyBatis一级缓存: 在一个 SqlSession 对象中创建一个本地缓存(local cache),对于同一个SqlSession
每一次查询,都会尝试根据查询的条件去本地缓存中查找是否在缓存中,
如果在,就直接从缓存中取出,然后返回给用户,一级缓存默认开启;否则,从数据库读取数据,
将查询结果存入缓存并返回给用户。
二级缓存称为全局缓存或者SqlSessionFactory级别,需要手动开启,可以实现跨SqlSession 的缓存,
也可以针对某个命名空间开启。
Mybatis的分页方式:
1.最原始的limit语句,在编写的SQL语句执行的时候传入两个变量
2.使用RowBounds对象,使用RowBounds封装两个参数
3.使用PageHelper插件
拦截器是SpringMVC提供的
执行Controller之前被调用
正在执行的程序和数据是在内存中
索引可以看做一本书的目录,快速查找书中的数据。索引默认使用B+树结构
创建索引
1.PRIMARY KEY(主键索引)
mysql > ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.UNIQUE(唯一索引)
mysql > ALTER TABLE `table_name` ADD UNIQUE (`column` )
3.INDEX(普通索引)
mysql > ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.FULLTEXT(全文索引)
mysql > ALTER TABLE `table_name` ADD FULLTEXT ( `column` )
5.多列索引(组合索引)
mysql > ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
CREATE TABLE table_name ( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOTNULL, age INT NOT NULL );
索引的优化规则
1.like语句的前导模糊查询不能使用索引
select * from doc where title like '%XX 前导模糊查询,不能使用
select * from doc where title like 'XX% 后导模糊查询,可以使用
2.union、in、or都能够命中索引,建议使用in,in查询优化耗费的CPU比union all多,但可以忽略不计
select * from doc where status in (1, 2);
3.负向条件查询不能使用索引
负向条件有:!=、<>、not in 、not exists、not like等
例如:
select * from doc where status != 1 and status != 2;
可以优化为:
select * from doc where status in (0,3,4);
4.联合索引最左前缀原则
如果在(a,b,c)三个字段上建立联合索引,那么他会自动建立 a|(a,b)|(a,b,c)组索引。
假如index(a,b,c), where a=3 and b like 'abc%' and c=4,a能用,b能用,c不能用。
5.不能使用索引中范围条件右边的列(范围列可以用到索引),范围列之后列的索引全失效
范围条件有:<、<=、>、>=、between等,索引最多用于一个范围列,如果查询条件中有两个范围列则无法全用到索引。
如下面这句SQL语句,(empno/title/fromdate)是联合索引,那么empno可以用到索引,而后两个不能使用到索引
select * from employees.titles where emp_no < 10010' and title='Senior Engineer'and from_date between '1986-01-01' and '1986-12-31'
6.不要在索引列上面做任何操作(计算、函数),否则会导致索引失效而转向全表扫描
7.索引不会包含有null值的列
只要列中包含有null值都将不会包含在索引中,复合索引中只要有一列含有null值,那么这一列对于次复合索引就是无效的。尽量使用not null约束以及默认值。
Spring使创建java企业应用程序变得更加容易,Spring是一个开源框架,简化企业开发,使得开发变得更加优雅和简洁。Spring是一个IOC和AOP的容器框架
IOC:控制反转 AOP:面向切面编程 容器:包含并管理应用对象的生命周期。
Spring的优势,Spring通过DI、AOP和消除样板式代码来简化企业级Java开发。Spring可扩展到其他领域,如Web服务、REST、移动开发以及NoSQL。低侵入式设计,代码的污染极低。独立于各种应用服务器,基于Spring框架的应用,可以真的做到一次编写,到处使用
-
Spring如何简化开发
基于POJO的轻量级和最小侵入性编程
通过依赖注入和面向接口实现松耦合
基于切面和惯例进行声明式编程
通过切面和模板减少样板式代码
AOP:我们需要将公共的代码逻辑抽象成一个切面,然后注入到目标对象(具体业务中),AOP是基于这样的一个思路实现的,通过动态代理的方式,将需要注入切面的对象进行代理,在进行调用的时候,将公共逻辑直接添加景区,不需要修改原有的逻辑代码,只需要在原来的业务逻辑上做一些增强功能即可。
AOP的实际应用:使用AOP实现日志打印功能。需要定义切点注解类,再定义切点参数,然后将切点绑定到业务方法上。
事务操作是AOP的一个核心体现,当一个方法添加@Transactional注解之后,Spring会基于这个类生成一个代理对象,会将这个代理对象作为bean,当使用这个代理对象的方法的时候,如果有事务处理,那么会先把事务的自动提交给关系,然后执行具体的业务逻辑。
IOC:通过构造函数参数,工厂方法的参数或者是工厂方法的构造函数或返回值的对象实例设置的属性,然后容器在创建bean时注入这些需要的依赖,这个过程相对创建对象的过程是相反的。
IOC容器来控制,实现过程中所需要的对象以及需要依赖的对象。
Spring Bean的生命周期
实例化 Instantiation
属性赋值 Populate
初始化 Initialization
销毁 Destruction
1.实例化Bean对象。2.设置对象属性。3.检查Aware相关接口并设置相关依赖、4.BeanPostProcessor的前置处理。5.检查是否是InitializingBean的子类来决定是否调用afterPropertiesSet方法。6.检查是否配置有自定义的init-method方法,若是定义了初始化方法,则调用。7.BenaPostProessor后置处理。8.注册必要的Destruction接口方便对象销毁。9.获取并使用Bean对象。10.是否实现DisposableBean接口调用具体方法进行对象的销毁工作。11.是否配置有destory方法,若定义了销毁方法,在此处调用。
Spring框架中使用了哪些设计模式:
1.工厂模式。Spring使用工厂模式,通过BeanFactory和ApplicationContext来创建对象
2.模板模式。Bean默认为单例模式
3.代理模式(Spring AOP利用了 Aspectj AOP实现,底层使用了动态代理)。
4.策略模式。
5.单例模式。
6.观察者模式。Spring事件驱动模型就是观察者模式的经典应用
7.适配器模式。
8.装饰者模式。
事务:是数据库中最小的执行单元,不可再分
事务管理:开启事务-->提交事务/事务回滚
数据库中事务管理默认开启
-增删改执行时,在他们执行之前,事务自动开启,执行成功,事务自动提交
-查不涉及事务
-查看事务管理是否自动开启 : show variables like 'autocommit'
-设置事务管理为关闭:set autocommit=off
-事务相关命令:begin 开启事务
commit 提交
rollback 回滚
事务的四大特性:
1.原子性(Atomicity):事务的原子性指事务必须是一个原子的操作序列单元,只允许出现两种状态之一,要么都成功,要么都失败。
2.一致性(Consistency):从一个有效的状态切换到另一个有效的状态
3.隔离性(Isolation):一个事务的执行不能被其它事务干扰。不同事务操作数据不同时,每一个业务都有完整的数据空间
隔离级别:读未提交read uncommited(一个事务还没有提交时,它做的变更就能被别的事务看到。可能出现脏读)、读已提交read commited(一个事务提交之后,它做的变更才会被其他事务看到。会出现不可重复读:一个事务两次读取同一行数据,两次读到的数据不一样)、可重复读 repeatable read (一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。会出现幻读:第二次查询结果比第一次多了些数据)、可串行化 serializable (对于同一行记录,写会加“写锁”,读会加“读锁”,当出现锁冲突时,后访问的事务需要等前一个事务执行完成,才能继续执行)
4.持久性(Duration):事务一旦提交之后,数据都应该永久的保存下来。
Spring事务失效情况:
1.bean对象不再被使用。2.方法的访问修饰符不是public。3.自身调用问题。4.数据源没有配置事务管理器。5.数据库不支持事务。6.异常被捕获。7.异常类型错误或者配置错误
InnoDB,面向OLTP Online Transaction Processing:在线事务处理方面的应用,是第一个完整支持ACID事务的存储引擎
MyISAM,是MySQL官方提供的引擎,主要面向OLAP OnLine Analytical Processing:在线分析处理。
tomcat是servlet容器
String、StringBuffer、StringBuilder
共同点:都是处理字符串数据的类,管理内部的一个char[]实现的,实现的接口大致相同特别是CharSequnence接口、有许多相同的API。
String不可变特性,每个字符串对象都是不可变的。其内部是管理一个char[]决定的,数组在内存中必须是连续的,其长度不可变,String不可变特性与final无关,final知识表示该类不能被继承。因为String的不可变性,所以修改字符串的方法返回的都是一个新的String对象,也因此String的修改操作效率十分低下,需要寻址,创建新对象。
StringBuffer、StringBuilder从一开始就会使用更长的数组,在许多调整字符串的操作中,StringBuffer、StringBuilder只需要调整内部的char[]即可,不需要寻址和创建新对象,若是默认char[]长度不足以满足运算需求,则会自动扩容,创建新对象。
StringBuffer是线程安全的,StringBuilder不是
StringBuffer为什么比StringBuilder效率慢
因为StringBuffer几乎所有方法都加了synchronized,为了确保多线程的安全牺牲了效率
线程创建的四种方式:
1.继承Thread类创建线程类,重写run方法并调用start方法
2.实现Runnable接口,重写run方法并调用start方法
3.实现Callable接口并实现call()方法,call方法作为线程执行体并且有返回值,java5提供了Future接口来代表返回值。
4.使用线程池
Redis是将数据存储在内存中的一种数据库,每秒可以处理超过10万次读写操作,是性能最快的Key-Value DB,支持事务、持久化、LUA脚本、LRU驱动事件、多种集群方案
优点:读写性能优异、支持数据持久化(AOF和RDB两种持久化方式)、支持事务,Redis的所有操作都是原子性的、数据结构丰富,共有五种数据类型、支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
缺点:数据库容量受物理内存的限制、不具备自动容错和恢复功能,主从机宕机都会导致前端读写请求失败、主机宕机前有部分数据未能及时同步到从机,切换ip后会引入数据不一致的问题、较难支持在线扩容。
为什么要用Redis/为什么要用缓存:
高性能,在缓存中读取数据会优于在硬盘上读取,在首次访问数据库的某些数据时,过程会较慢,之后会存储入缓存中,提高读取速度。
高并发,直接操作缓存能够承受的请求是远大于直接访问数据库的,所以可以考虑把数据库的部分数据转移到缓存中。
Redis的五种数据类型
String类(字符串整数或浮点数)、hash类(包含键值对的无序散列表)、list类(列表)、set类(无序集合)、Zset类(有序集合)
持久化:持久化就是把内存中的数据写到磁盘里,防止服务器宕机内存数据丢失。
Redis持久化机制:支持RDB(默认)和AOF机制
RDB:Redis DataBase缩写快照,是Redis默认的持久化方式,按照一定的时间将内存的数据以快照的方式保存到硬盘中,对应产生的数据文件为dump rdb。通过配置中的save参数。
优点:1.只有一个文件 dump rdb,方便持久化。
2.容灾性好,一个文件可以保存到安全的磁盘。
3.性能最大化,fork子进程完成写操作。让主进程继续处理命令
4.相对于数据集大时,比AOF启动效率更高
缺点:1.数据安全性低,RDB是隔一段时间进行持久化,如果持久化之间发生故障,会发生数据丢失
AOF:Append-only file持久化方式,是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会优先选择AOF恢复
优点:1.数据安全,可以配置appendfsync属性,有always,每进行一次操作就记录一次
2.通过append模式写文件,即使中途服务器宕机,可以通过redis-check-aof工具解决
3.AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))
缺点:1.AOF文件比RDB文件打,且恢复速度慢
2.数据集大的时候,启动效率比rdb低
缓存雪崩,指缓存同一时间大面积的失效,所以后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉
解决方案:1.缓存数据的过期时间设置成随机,防止同一时间大量数据过期现象发生
2.一般并发量不是特别多的时候,使用最多的解决方案是加锁排队
3.给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果失效,则更新数据缓存
缓存穿透,指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决方案:1.接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截
2.从缓存取不到的数据,在数据库中也没有渠道,这是可以将key-value对写为key-null,可以防止用户反复用一个id暴力攻击
3.采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中
SpringMVC是一种基于java,实现了web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想。
SpringMVC五大组件、对请求的处理流程
DispatcherServlet --前端、中央处理器:用于接收和响应所有的请求
HandlerMapping --处理映射器:映射关系解析
Controller --控制器:处理请求,返回数据
ModelAndView --视图数据模型
ViewResolver --视图解析器
中央处理器解析请求-》处理映射器寻找映射关系-》控制器处理请求-》视图数据模型发送视图-》中央处理器将视图交给视图解析器-》视图解析器解析出视图路径返回给中央处理器-》中央处理器接收路径-》渲染视图
SpringBoot框架相对于SpringMVC框架来说,更加专注于开发微服务后台接口,不开发前端视图,同时遵循默认优于配置,简化了插件配置的流程。
数据库引擎:
InnoDB引擎:是MySQL5.5或更高版本的默认引擎,支持外键引用完整性约束。拥有自己独立的缓冲池,常用的数据和索引都在缓存中
ISAM(Indexed Sequnential Access Method, 索引顺序存取方法):执行读取操作的速度很快,不占用大量的内存和存储资源
MYISAM引擎:是MySQL的ISAM扩展格式和缺省的数据库引擎提供了索引和字段管理的大量功能,使用了表格锁定来优化多个并发的读写操作。
MEMORY存储引擎:将表中的数据存储到内存中,为查询和引用其他数据提供快速访问。特性:每个表可以有32个索引,每个索引16列,以及500字节的最大键长度、执行HASH和BTREE缩影、可以在一个MEMORY表中有非唯一键值。
RSA加密算法
1.选两个质数 p=?/q=? 列如3、11
2.质数相乘 n=p*q = 33
3.欧拉函数 t=(p-1)*(q-1) = 2*10 = 20
4.选公钥 e 必须是质数;1<e<t;且不是t的因子 e= (3,33)这里选择3
5.算私钥 (d*e)%t=1 d=(7,33)
Nacos: 是Spring Cloud Ailbaba提供的一个软件。主要具有注册中心和配置中心的功能,微服务中的所有项目都必须注册到 注册中心才能称为微服务的一部分
需要添加spring-cloud-starter-alibaba-nacos-discovery依赖,默认端口是8848
Nacos心跳机制,内部注册的服务分为两大类。1.临时实例(默认)2.持久化实例(永久实例)
cloud:
nacos:
discovery:
# ephemeral设置当前项目启动时注册到nacos的类型 true(默认):临时实例 false:永久实例
ephemeral: true
默认情况下,启动服务后每隔5秒会向nacos发送一个"心跳包",这个心跳包中包含了当前服务的基本信息,如果 nacos15秒内没有收到某个服务的心跳包,Nacos会将这个服务标记为不健康状态,如果30秒内没有收到,会将这个 服务从注册列表中剔除。这些时间可以通过配置修改
duboo负载均衡策略算法:
1.random loadbalance:随机分配策略(默认)
随机生成随机数,在哪个范围让哪个服务器运行
优点:算法简单,效率高,长时间运行下,任务分配比例准确。缺点:偶然性高,如果连续几个随机请求发送到性能若的服务器,会导致异常设置宕机
2.round Robin Loadbalance:权重平均分配
如果几个服务器权重一致,那么就是依次运行。在Dubbo2.7之后更新了这个算法使用“平滑加权算法”优化权重平均分配策略
3.leastactive Loadbalance:活跃度自动感知分配
记录每个服务器处理一次请求的时间,按照时间比例来分配任务数,运行一次需要时间多的分配的请求书较少
4.consistanhash Loadbalance:一致性hash算法分配
根据请求参数进行hash运算,以后每次相同参数的请求都会访问固定服务器,因为根据参数选择服务器,不能平均分配到每台服务器上,使用的也不多。
Seata:Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务,是Spring Cloud Ailbaba提供的组件。
因为事务的四个特性:ACID特性,在业务中,必须保证数据库操作的原子性。单体项目使用Spring声明式事务来解决本地的事务问题,在微服务环境下,需要专门的解决事务问题的“分布式事务”解决方案。这是就要用到Seata
在一个分布式项目中,两个不同服务器中不同的方法在同一事务中调用,若其中一个方法出现异常,则需要回滚而不同的服务器中的方法不能被管理到,这是就需要Seata来进行管理。
seata中有三个重要角色:
TC(Transaction Coordinator) -事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚
TM(Transaction Manager) -事务管理者:定义全局事务的范围、开启全局事务、提交或回滚全局事务。
RM(Resource Manager) -资源管理者:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
Seata提供四种不同的分布式事务解决方案:
XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入
TCC模式:最终一致的分阶段事务模式,有业务侵入
AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
SAGA模式:长事务模式,有业务侵入
Spring Cloud是微服务架构,包含了很多组件。
ElasticSearch:智能搜索,分布式的搜索引擎。 是ELK的一个组成。
E:EalsitcSearch搜索和分析功能
L:Logstach 搜集数据的功能,类似于flume。
K:Kibana 数据可视化(分析),可以用图表的方式去展示。
RBAC模型:Role-Based Access Control 基于角色的访问控制。在模型中有三个基础组成部分,分别是:用户、角色和权限。
HashMap在1.7中使用数据结构是数组加链表使用Entry类存储Key和Value,1.8中底层是数组+链表/红黑树,使用Node类存储Key和Value
当链表的长度大于8的时候就会转换为红黑树,转换红黑树之前会先查看数组的长度是否大于64,若小于,会优先对数组进行扩容 resize,而不是把链表转换为红黑树
HashMap的原理:根据键的hashCode值存储数据,HashMap的线程是不安全的,可以用Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap
HashTable线程同步,HashMap线程不同步。HashTable不允许<键,值>有空值,HashMap允许存在,HashTable中hash数组的默认大小是11,增加的方式是old*2+1,HashMap中hash数组的默认大小是16,增加方式是2的指数倍
synchronized和lock有哪些区别
synchronized是一个java的关键字,在jvm层面上,锁的释放是线程执行完同步代码时释放或者线程执行发生异常,jvm会让线程释放。可重入,不可中断,非公平。支持少量同步,独占锁。
Lock是jvm的一个接口,锁的获取有多重方式,可以尝试获得锁(通过tryLock判断),锁的释放必须在finally中释放锁,否则容易造成线程死锁。可重入,可判断可公平,适用于大量同步,锁的场景为公平锁和非公平锁。
java容器分为Collection和Map两大类,各自都有很多子类
List有序集合
AbstractList:有序集合的最小化抽象实现。ArrayList基于数组实现的有序集合
CI/CD 持续集成、持续交付
CAP原则:又称为CAP定理
指在一个分布式系统中
一致性(Consistency)
可用性(Availability)
分区容错性(Partition tolerance)
图(Graph)
TCP协议如何保证数据传输的可靠性
1.效验和
TCP将保持首部和数据的检验和,如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段
2.序列号
序列号可以用作应答和去掉重复序列号的数据。
3.确认应答
传输过程中,每次接收方收到数据后,都会对传输方进行确认应答
4.连接管理
三次握手、四次挥手
5.流量控制
根据接收端能力进行发送
6.拥塞控制
会尝试发送小部分的数据探路
二叉树遍历手工算法
前序:(根左右)
中序:(左根右)
后序:(左右根)
排序算法:
冒泡排序:将相邻的两个元素进行比较,每一轮会将当前轮最大的元素放在当前轮的最后一位
选择排序:假定第一个索引处是最小元素,然后比较处所有元素中最小的元素,将该元素放在第一个位置,然后依次循环选出剩下的次小的元素
插入排序:将元素分为已排序和未排序两组,未排序的第一个元素向已排序的元素进行插入,通过倒序遍历已排序的元素,为未排序的元素找到合适的位置。
希尔排序:选定一个增长量,按照增长量作为数组分组的一句,对数据进行分组,分组完之后对每组数据进行插入排序,再减少增长量,进行插入排序
归并排序:将一组数据尽可能分为两组元素数相等的子组,并对每一个子组继续拆分,直到每个小组元素数为一,将两个相邻的自诩合并成一个有序的大组
快速排序:设定一个分界值,通过该分界值将元素分成左右两部分,大于或等于放到数组右边,小于放在数组左边。然后将左侧和右侧的元素分别进行上述操作。
排序的稳定性:在排序后能够保证相同元素的位置不变,排序是稳定的。其中不稳定的有,快速排序,希尔排序,选择排序。稳定的有冒泡排序,插入排序,归并排序。
时间复杂度:冒泡算法的时间复杂度:O(N^2),选择排序:O(N^2),插入排序:O(N^2),
希尔排序:O(nlogn),快速排序:O(nlogn),归并排序:O(nlogn)。
变量是有作用域的,通过作用域的不同将变量分为全局变量和局部变量
局部变量的作用域在执行的该方法中,全局变量声明类中,在方法外,可以被所有方法使用。
二叉树和堆的区别或联系。
二叉树的特点是每个节点最多有两个儿子,左边是左子树,右边是右字数
堆是一种特殊的完全二叉树所有父节点逗比子节点小的完全二叉树称为堆。
如何判断链表中有环,通过两个指针,p1,p2,p2向后移动两位,p1向后移动一位,若指针指向的元素都为null,则不存在环,若存在环,则两个元素必定有相等的情况
反射机制是在运行状态中,对于任意一个类都能够知道类的所有属性和方法,动态的获取信息就被称为反射
在Spring中实例化对象。JDBC连接数据库
JVM中包含:类装载子系统、程序执行引擎、运行时数据区(本地方法栈、虚拟机栈、堆、元空间(方法区)、程序计数器)
元空间:1.8开始叫作元空间,以前叫方法区,和方法区的区别是:元空间会将数据直接保存到计算机的物理内存上,保存的是类的信息
类装载子系统:用于加载类信息的,将所有的类信息加载到元空间上
程序执行引擎:执行代码,且会将执行到的代码行号记录到程序计数器中
程序计数器:会按照线程进行分配空间,为每个线程分配属于自己的内存,用于记录当前线程执行到的行号的,而这个行号由程序执行引擎写入
本地方法栈:服务于本地方法,用于保存本地方法中产生的局部变量,内部和栈的结构是一样的
linux常用的指令
help:两种用法 1.内部用法 help cd 2.外部命令 --help
pwd:显示绝对路径
ls:查看文件和目录的命令 ls -a/ls -1/ls -d/ls -h/ls -R
du:用来统计目录及文件的空间占用情况 du -a/du -h/du -s
mkdir:
添加表字段
alter table 表名 add 字段名 数据类型
alter table 表名 add 字段名 数据类型 first :放在最前面
alter table 表名 add 字段名 数据类型 after 字段名 :放在什么什么的后面
删除表字段
alter table 表名 drop 字段名
修改表名
rename table 表名 to 新名
Spring Security框架用于实现登录
在控制器方法前添加@PreAuthorize("[权限名称]")SpringSecurity在运行该方法之前进行核查
如果不具备这个权限会返回403状态码
单点登录:跳转到sso登录
单点登录的解决方案:
Session共享
这种方式的核心思想是将用户的登录信息共享给其他模块适用于小型的,用户量不大的微服务项目
cookie+redis实现
用户在项目的任意一个模块登录后,该模块会将用户的登录信息放到redis和cookie中,用户每次访问都会携带这个cookie
token实现
token是按照一定规则生成的字符串,字符串中可以包含用户信息。开发人员自行指定生成规则,也可以使用提供好的生成规则,如JWT。两种返回方式,cookie返回和地址栏返回。
==和equals区别:
首先,==对比基本数据类型比较的是值,==比较两个对象时比较的是两个对象的地址
equals方法全在与object类中,底层依赖的是==,在没有重写equals方法的类中,对比的效果和==号是一样的。若是重写了equals方法,一般比较的是两个对象的值
hash值是一个十进制的整数,有系统随机给出作为模拟出来的地址,不是数据存储的物理地址
hashcode的作用主要是为了查找的快捷性,将数据存在hash表的位置中,这样每次对比是就可以减少对比的次数
若是两个对象的equals相等,那么这两个对象的HashCode一定相同
如果两个对象的HashCode相同,不代表两个对象就相同,只能说明两个对象在散列存储结构中,存放于同一个位置。
常见的运行时异常
ClassNotFoundEcxeption:指定类不存在
NoSuchBoundsEcxeption:方法不存在
ClassCastException:类转换异常
indexOutofBoundsException:索引越界异常
ArrayindexOutofBoundsException:数组下标越界异常
NumberFomatEcxeption:数字格式异常
SQLException:Sql语句执行异常
NullPointerException:空指针异常
ArrayStoreException:数据存储异常,操作数组时类型不一致
IOEcxeption,IO操作的异常
IllegalArgumentException:非法参数异常
并发和并行的区别
并发是指一个处理器同时处理多个任务,并行是指多个处理器或是多核的处理器同时处理多个不同的任务
并发是逻辑上的同时发生,而并行是物理上的同时发生
List、set、map详解及区别
list接口,继承于Collection接口,list是集合的一种。List是有序队列,list中每一个元素都有一个索引;第一个元素的索引值是0,list中允许有重复的元素,实现list接口的集合主要有:ArrayList、linkList、Vector、Stack
set是一个继承于Collection的接口,Set是一种不包括重复元素的Collection。它维持它自己的内部排序。与list一样,允许null的存在,但只有一个。实现Set接口的集合有:HashSet、TreeSet、LinkedHashSet、EnumSet。
Map是由一系列的键值对组成的集合,提供了key到value的映射。在Map中它保证了key与value之间的一一对应关系。不能存在相同的key值,value可以相同。实现map的集合有:HashMap、HashTable、TreeMap、
WeakHashMap。
list可以使用for循环,也可以使用迭代器,set只能用迭代,因为无序,无法用下标来取得想要的值。
Set和list对比:
Set检查元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。list:和数组类似,list可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
Map适合储存键值对的数据
异常处理:
异常处理的五个关键字:try、catch、finally、throw、throws。
异常抛出throw,用来抛出一个指定的异常对象。用法:throw new xxxException("异常产生的原因")
throw关键字必须写在方法的内部。new的对象必须是Exception或者其子类对象。
抛出指定的异常对象,就必须处理这个异常对象。
若关键字后面创建的是RuntimeException或者是RuntimeException的子类对象。我们可以不处理默认交给JVM处理。
声明异常,throws将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理,那么必须通过throws进行声明,让调用者去处理。
throws运用于方法声明之上,用于标识当前方法不处理异常,而是提醒该方法的调用者来处理异常。
进程和线程:
进程:一个在内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个xx.exe就是一个进程。
线程:进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可以共享数据。
与进程不同的是,同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间切换工作是,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
一个进程崩溃后,在保护模式下不会对其他进程产生影响,一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。