目录
mysql在插入一条数据后,如何能获得到这个自增id的值呢?
一
数据库MySql如何优化的?
为什么要优化:
数据量过大的话,读取就比较慢
优化手段:
-
第一步是表字段的设计,考虑更优的存储计算
1.使用8字节的主键bigint,而不是直接使用int来做主键
2.varchar 不存的时候不占空间,存多长数据就占多少空间
3.尽可能选择小的数据类型和指定短的长度
4.尽可能使用 not null
5.符合三大范式
-
利用好MySQL自身提供的功能,如 存储引擎的选择、索引等
-
横向扩展:MySQL读写分离
分布分表,Mysql集群
-
SQL语句的优化(收效甚微)
Sql语句的优化
1.设置合适的字段属性 字段的长度越小,占用的内存就越小,性能就越好 2.使用JOIN语法: (1) JOIN语法分为内连接、左(外)连接、右(外)连接 (2) 优点:性能快 3.尽量少使用SELECT * (1) SELECT *会进行全表查询,消耗的性能大 4.在查找唯一一条数据的时候,使用limit 1,在查找到数据时候就会终止查找 5.、可以使用limit进行分页 6.、尽量少使用排序order by、order by desc 7.、使用索引 加快索引速度
你使用SpringBoot的时候各种配置文件是怎么引入的
如过时yml配置中的属性,@ConfigurationProperties注解设置与yml配置文件中对应的属性名,吧文件中的值通过自动注入,获取值。
配置类:我们需要进行手动创建一个类,然后在这个类中使用@Configuration注解:指定当前的类是配置类,配置类就相当于配置文件。
@Bean注解将一些类或对象交由Spring容器管理
@Value注入配置文件的属性值
说说你做过的项目和你主要负责的模块
讲讲Redis,你在项目中有用过Redis吗?
Redis是一个高性能的内存数据库,以key-value方式存储数据,可以作为缓存使用。
redis基于内存,内存IO效率远远高于磁盘
redis可以支撑万级连接
缓存使用的流程
按id查询商品的过程
1) 以id为键查询Redis缓存,如果能查到就返回数据,结束
2)如果查不到,就查询数据库,数据库查到,缓存到Redis,返回数据
3)如果数据库查不到,返回null,结束
4)增删改数据库的同时,要修改缓存
数据库建表的时候int(1)和int(2)的区别
M 表示最大显示宽度,M 的值跟 int(M) 所占多少存储空间并无任何关系, int(1)、int(2) 在磁盘上都是占用 4 btyes 的存储空间
二
#和$的区别
#是占位符,能防止sql注入,对应的变量会自动加上''
$是拼接符,不能防sql注入,对应的变量不会加上''
Springmvc的执行流程
Jvm参数
(2条消息) 4、常用JVM参数配置_wenbaoxie的博客-CSDN博客
反射的三种创建方式
类名.class
对象名.getclass
class.forname(包名.类名)
Arraylist和linklist的区别
Arraylist 查找快增删慢 底层数据结构:数组
linklist 增删快查找快 底层数据结构:双向链表
Arraylist一次扩容多少
1.5倍
Vector是如何实现的安全的
在Vector类中的方法中加入了synchronized
讲讲你知道哪些排序方法,并说下他们的时间复杂度
1.选择排序:不稳定,时间复杂度 O(n^2)
2.插入排序:稳定,时间复杂度 O(n^2)
3.冒泡排序:稳定,时间复杂度 O(n^2)
4.堆排序:不稳定,时间复杂度 O(nlog n)
5.归并排序:稳定,时间复杂度 O(nlog n)
6.快速排序:不稳定,时间复杂度 最理想 O(nlogn) 最差时间O(n^2)
7.希尔排序:不稳定,时间复杂度 平均时间 O(nlogn) 最差时间O(n^s) 1<s<2
三
stringbuild跟stringbuffer的区别
stringbuild线程不安全,运行速度快
stringbuffer线程安全,运行速度相对于stringbuild慢
hashmap跟hashtable区别
用法和结构和HashMap一样
1.HashMap的性能高于Hashtable
2.Hashmap可以存null的键值对,hashtable和ConcurrentHashMap不能,
3.Hashmap没有多线程机 制,所以多线程不安全,hashtable和ConcurrentHashMap有线程锁,是线程安全的,
4.hashtable多线程下,会锁住整个code表,效率很低,ConcurrentHashMap,为了提高效率,将code表分成了十六个桶,每次锁时只会锁一个桶,提高了效率
css类选择器
.class 类选择器
#aaa id选择器
p p,a,li 元素选择器
[name="aaa"] 属性选择器
h1 span 派生选择器
es的使用为什么要用
对于负责的搜索业务和大的数据量时,传统的搜索就力不从心了
Elasticsearch
-
分布式,无需人工搭建集群
-
Restful风格,一切API都遵循Rest原则,容易上手
-
近实时搜索,数据更新在Elasticsearch中几乎是完全同步的
-
倒排索引通过value找到key,对内容进行分词,生成倒排索引
redis为什么要用
1)缓存击穿
高并发的情况下,短时间内缓存会被穿过,请求直接打到数据库上,可能导致数据库压力过大。
解决方案:对代码上锁(双重检查锁)
2)缓存穿透
高并发的情况下,如果查询不存在的数据,因为缓存和数据库都不存在,请求都会打到数据库上,可能导致系统崩溃。
解决方案:
1) 保存不存在的数据到缓存中,设置一定过期时间
2) 布隆过滤器(直接过滤掉不存在数据的请求) 不能准确判断是否存在数据,能准确判断数据不存在
3)缓存雪崩
高并发的情况下,缓存服务器重启或热点数据同时过期,全部访问数据库,导致数据库宕机
解决方案:
1)配置缓存集群
2)尽量给热点数据设置不一样的过期时间,相对均匀
消息队列的用法
作用是采用FIFO(先入先出)的方式实现程序之间(服务、进程、线程)的消息通信
MQ的优点有: 1)解耦
服务之间进行解耦,A服务调用B服务时,需要编写相关的代码,调用情况发生改变时,需要修改调用的代码
2)异步
传统的同步调用方式,需要等待调用完成,才能进行其它业务
异步调用方法,将消息发送到队列中,就可以返回,执行其它业务,速度大大提升
3)削峰
出现流量激增的情况时,消息队列可以设置消息的最大数量,处理一部分消息,其它消息交给队列排队处理
MQ的缺点:
-
增加了系统的复杂性
-
降低了系统的可用性(消息队列出现问题,整个系统的通信受影响)
常见的设计模式知道几种
装饰者设计模式
开闭原则:程序开发过程中,对功能的扩展开放,对功能的修改关闭,提高程序的稳定性
目的:在不修改原有类的代码基础上,对类的功能进行扩展
在Java的IO包下,大量应用了装饰者模式
实现
1.装饰者和被装饰者都要实现相同的接口或继承相同的父类 2.装饰者中定义一个被装饰者的对象 3.给装饰者传入被装饰者对象 4.调用装饰者的方法时,也调用被装饰者的方法,同时进行功能的扩展
单例设计模式
目的:保证一个类只有一个实例(对象)
应用场景:
对于某些大的对象,单例模式能节省系统资源 应用某些特定业务需求,如:保证公司只有一个CEO
实现 PS : Runtime类就是单例模式的
将所有构造方法定义为private 在类中创建一个静态的对象 在类中定义一个静态方法来返回该对象
两种单例模式
饿汉式:类中一开始就创建对象,不管后面是否使用对象,都消耗了内存。
懒汉式:类中一开始不创建对象,调用返回对象方法时再创建对象。
代理模式
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
代理模式的作用
代理模式的作用
1)中介的作用,当调用者不能或不方便调用某个对象时,代理起到中介的作用,帮助调用者间接
的调用对象。
2)符合开闭原则,在不修改原有类代码的前提下,对类的功能进行增强。
代理模式的分类
代理模式分为两种:
1) 静态代理,在运行前,通过编写代码的方式生成代理类
2) 动态代理,在运行后,通过反射机制生成代理类
静态代理
1)代理者和被代理者都实现相同的接口
2)代理者包含被代理者的对象
3)创建代理对象时传入被代理对象
4)代理者执行方法时,会调用被代理者的方法,同时扩展新的功能
静态代理的问题:一个代理类只能代理一种业务,如果有多种业务,就必须创建大量的代理类。
动态代理
和静态代理不同,动态代理是在运行时,通过反射机制动态生成代理类。开发者不需要手动编写新
的代理类。
动态代理分类
JDK动态代理
JDK自带的,前提是:被代理类必须实现过接口。
实现步骤
1) 实现InvocationHandler接口
2)实现invoke方法
3)通过Proxy.newProxyInstance方法返回代理对象
CGLib动态代理
需要引入CGLib依赖,它的原理是:通过反射+继承机制动态生成被代理类的子类,所以被代理类
不能是final的。
实现步骤
1)引入cglib
2)实现MethodInterceptor接口
3)实现intercept方法
4)通过Ehancer返回代理对象
spring跟springcloud区别
1、SpringBoot只是一个快速开发框架,使用注解简化了xml配置,内置了Servlet容器,以Java应用程序进行执行。
2、SpringCloud是一系列框架的集合,可以包含SpringBoot。
四
vue的生命周期
Vue 的生命周期总共分为8个阶段:创建前/后,载入前/后,更新前/后,销毁前/后。
1、beforeCreate(创建前)
表示实例完全被创建出来之前,vue 实例的挂载元素$el和数据对象 data 都为 undefined,还未初
始化。
2、created(创建后)
数据对象 data 已存在,可以调用 methods 中的方法,操作 data 中的数据,但 dom 未生成,$el
未存在 。
3、beforeMount(挂载前)
vue 实例的 $el 和 data 都已初始化,挂载之前为虚拟的 dom节点,模板已经在内存中编辑完成
了,但是尚未把模板渲染到页面中。data.message 未替换。
4、mounted(挂载后)
vue 实例挂载完成,data.message 成功渲染。内存中的模板,已经真实的挂载到了页面中,用户
已经可以看到渲染好的页面了。实例创建期间的最后一个生命周期函数,当执行完 mounted 就表
示,实例已经被完全创建好了,DOM 渲染在 mounted 中就已经完成了。
5、beforeUpdate(更新前)
当 data 变化时,会触发beforeUpdate方法 。data 数据尚未和最新的数据保持同步。
6、updated(更新后)
当 data 变化时,会触发 updated 方法。页面和 data 数据已经保持同步了。
7、beforeDestory(销毁前)
组件销毁之前调用 ,在这一步,实例仍然完全可用。
8、destoryed(销毁后)
组件销毁之后调用,对 data 的改变不会再触发周期函数,vue 实例已解除事件监听和 dom绑定,
但 dom 结构依然存在。
list去重,返回去重结果
jq选择器,如何选中元素
JQuery特有的过滤选择器
1) 基本过滤选择器 2)内容过滤选择器 3)可见过滤选择器 4) 属性过滤选择器
5) 子标签过滤选择器 6) 表单属性过滤选择器 7) 表单元素过滤选择器
面向对象6大原则
1.单一责任原则SRP(Single Responsibility Principle):
一个类只有一个引起变化的原因。
一个类只有一个独立责任,不负责其他职责
2.开放封闭原则OCP(Open Closed Principle):
软件实体对扩展开放,对修改封闭。
对功能扩展开放,对功能修改封闭。
3.里氏替换原则LSP(Liskov Substitution Principle):
子类的实例能够替换其父类的实例。
子类尽量不重写父类,尽量用扩展。
4.依赖倒置原则DIP(Dependency Inversion Principle):
依赖抽象不要依赖具体实现。
设计的类依赖接口
5.接口分离原则ISP(Interface Segregation Principle):
使用多个专门的接口比使用单一的总接口要好。一个类对另一个的依赖性建立在最小的接口上。
6.迪米特法则LoD(Law of Demeter):也称为最少知识原则LKP(Least Knowledge Principle)
一个对象应该对其他对象有最少的了解。
设计类的时候用用别人越少,用别人越简单越好
五
创建线程的三种方式
继承Thread类
1.继承Thread类 2.重写run方法 3.调用start启动线程
实现Runnable接口
1.实现Runnable接口 2.实现run方法
3.创建实现Runnable接口的对象,传入Thread对象中 4.启动线程
实现Callable接口
1.实现Callable接口,实现call方法 2.创建Callable对象,传入FutureTask对象
3.创建FutureTask对象,传入Thread对象 4.启动线程
5.调用get方法得到返回结果
线程中常用的方法
方法 | 介绍 |
---|---|
start() | 启动 |
stop() | 停止(禁用,可能导致线程死锁等问题),停止线程可以让run执行结束 |
String getName() | 获得线程的名字 |
setName(String) | 设置线程名字 |
sleep(long) | 进入睡眠,毫秒 |
setPriority(int) | 设置线程的优先级(1~10从低到高)越高抢CPU几率更高 |
setDaemon(boolean) | 设置为后台线程 true ,后台线程是为其它线程服务的,如果没有其它线程存在,就自动死亡;使用案例:GC就是一种后台线程 |
join() | 线程的加入(合并)让其它线程先执行完,再执行自己的指令 |
list set map集合特性
List接口
继承了Collection接口
List集合的特点:
-
可以添加重复的数据
-
数据可以通过下标单独访问
-
数据可以排序
Set接口
继承了Collection接口
Set集合的特点:
-
不能添加重复的数据
-
数据不能单独访问
Map接口
Map集合的特点:
-
数据以键值对保存
-
键不能重复
-
数据可以通过键访问
六
Jdk8比以前有什么新特性
函数式接口,Lambda表达式,方法引用,Stream接口, Optional类等。
elasticsearch用的什么查询
ElasticSearch常用的几种查询方式,terms 查询是term的扩展,可以支持多个vlaue匹配,只需要一个匹配就可以了。
1 term查询(精准查询)
term是ES中的精准查询,不会参与ES分词查询。
2 math查询(分词匹配查询)
match查询是按ES分词的倒排表进行查询,而keyword不会被分词,match的需要跟keyword的完全匹配可以。可以用于一般性的匹配查询。
3 fuzzy查询(模糊查询)
fuzzy查询可以用于纠正去拼写的问题,fuzziness是可以允许纠正错误拼写的个数
4 wildcard(通配符查询)
通配符查询允许我们指定一个模式来匹配,而不需要指定完整的trem,匹配的方式类似于match的
分词匹配查询。
?将会匹配如何字符;*将会匹配零个或者多个字符。
5 bool查询(布尔查询)
bool查询本身没有查询功能,而是基于逻辑值使用前面几种查询方式进行组合查询
Spring boot有什么注解
@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。
@Configuration 等同于spring的XML配置文件;使用Java代码可以检查类型安全。
@EnableAutoConfiguration 自动配置。
@ComponentScan 组件扫描,可自动发现和装配一些Bean。
@Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。
@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。
@Autowired自动导入。
@PathVariable获取参数。
@JsonBackReference解决嵌套外链问题。
@RepositoryRestResourcepublic配合spring-boot-starter-data-rest使用。
Hashmap+list什么时候触发红黑树
满足:链表长度到8,并且数组长度到64
判断链表长度到达8,调用treeifyBin()方法
用treeifyBin()的方法,先判断数组长度是否小于64,小于则进行扩容;否则,转红黑树。
面向对象的理解
面试对象是一种思想,万物皆可为对象.
封装(Encapsulation):将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能。
继承(Inheritance):是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法。
多态(Polymorphism):子类对象可以直接付给父类变量,但运行时依然表现出子类的行为特征,即同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。
Linux常用命令
切换目录 cd 目录名 查看目录 ls 目录名(不写就是查看当前目录) -l 详细列表 -a 所有文件 查看目录详情 ll 目录名
创建目录 mkdir 目录名 删除目录 rm 目录名 -r 遍历所有子目录 -f 强制删除
创建\打开文件 vi 文件名 三种模式: 命令模式 能删除、复制、粘贴,无法编辑 输入模式 编辑内容 命令行模式 退出、保存文件 操作方式:默认进入命令模式,按i进入输入模式,按esc回到命令模式,按:进入命令行模式 命令模式 x 删除一个字符 dd 删除一行 yy 复制一行 p 粘贴 u 撤销 命令行模式 wq 保存退出 q 退出 (如果有修改,此方式退出会出错) q! 强制退出
cat 显示整个文件内容(不支持分页) more 分页显示(只能向前分页查询) less 分页显示,功能比more强大。(支持前后分页查询) 支持文本查找,/查找内容 向下查询 ; ?查找内容 向上查找内容 退出less模式,点击q
对比vi命令:cat、more、less仅仅是用来进行文本阅读命令,vi用来进行文本编辑的命令。 查询当前文件中是否包含有java单词,如果包含有Java单词的所有行全部显示出来。 cat 文件名 | grep 查询文字
find 查找目录 -name 文件名称 find 查找目录 | grep 名称
which 命令名称
移动文件 mv 原文件 目标文件 复制文件 cp 原文件 目标文件
解压指令:tar -zxvf 压缩指令:tar -zcvf -z:表示压缩和解压缩的格式为gz压缩文件(gzip) -c::表示压缩 -x:表示解压缩 -v:表示显示压缩或者解压缩的详细过程。 -f:表示指定压缩或者解压缩的文件,只能放在命令的最后 tar -zcvf demo.tar.gz demo2.txt tar -cvf 压缩后的文件名称 待压缩的文件 tar -xvf 待解压的解压包名
通过端口查看进程:netstat –apn | grep 8080 通过端口查看进程:lsof -i:3306 通过进程名称查询进程:ps -ef | grep redis 杀死进程:kill -9 PID(进程ID,-9表示强制杀死)
七
mysql和oracle的区别
MySQL和Oracle的区别_MengJing_的博客-CSDN博客_mysql和oracle区别
Radis怎么实现数据同步
Vue怎么实现中英文切换,用什么实现
Vue怎么实现中英文切换,用什么实现
一、安装 vue-i18n插件
二、main.js文件的配置
三、定义两套中英文的 js 文件,并通过 require 的形式引入到 main.js。 在 main.js 中的代码中,可以看到,当 locale 的值为‘zh-CN’时,版本为中文;当 locale 的值为‘en-
US’,版本为英文。当然你也可以换成 zh 和 en,这个自定义就好,对应上就可以。 四、绑定点击事件,来修改 locale 的值去调用对应的语言包实现语种切换。
五、vue-i18n 数据渲染的模板语法
我们知道 vue 中对于文字数据的渲染,有以‘’{{}}‘’或者 v-text、v-html等的形式,同样的使用国际化
后,依旧可以沿用,但需要一点修改。
八
在jdbc中是使用什么实现占位符
对比 Statement 接口, PreparedStatement 接口的优点: 1.使用该接口操作的 sql 语句会先预先编译成指令在发送给数据库, 数据库就执行指令即可, 这样就提高了一定速度, 2.该接口可以避开 sql 需要使用字符串拼接的方式, 从而解决 sql 注入的安全风险, 而是使用占位符 (?) 来代替原来的字符串拼接.
mybaits常用注解
@Insert : 实现新增 @Update: 实现更新 @Delete:实现删除 @Select:实现查询 @Result: 实现结果集封装 @Results: 可以与@Result 一起使用,封装多个结果集 @ResultMap: 实现引用@Results 定义的封装 @One: 实现一对一结果集封装 @Many: 实现一对多结果集封装
@CacheNamespace: 实现注解二级缓存的使用 复杂关系映射的注解说明 @Results 注解 代替的是标签<resultMap> @Resutl 注解 代替了 <id> 标签和<result> 标签 @One 注解(一对一) 代替了<assocation> 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象 @Many 注解(多对一) 代替了<assocation> 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象
mysql在插入一条数据后,如何能获得到这个自增id的值呢?
使用select last_insert_id() 可以取到最后生成的主键。
九
索引的作用
加快查询速度,用户查询时,先找索引,通过索引找到实际数据的位置,再直接定位到实际数据上,极大提高查询速度
缺点: 1. 也是数据,需要占存储空间 \2. 降低增删改的速度 \3. 创建索引也需要一定的时间
控制反转和注入方式
控制反转
控制是什么?JavaBean(Java对象)的创建和管理
反转是什么?一般情况下对象的创建和管理由开发者控制,反转是把对象的创建和管理交给容器完成,然后再交给开发者。
IOC的主要作用是:解耦。
没有IOC的程序中,我们使用new来完成对象的创建,如果需要的对象的类型发生改变,就需要手动修改代码。
有了IOC后,对象的创建由第三方(Spring容器)完成,由Spring来管理应用中所有对象的生命周期,开发者只需要关注自己的业务逻辑,代码更利于扩展和维护。
注入方式
\1) set方法注入,就是上面通过property进行配置
\2) 构造方法注入
\3) 自动装配
可以通过bean的autowire属性配置 类型:
- no 默认,不自动装配
- byType 通过类型查找对象,如果相同类型的对象有多个,会出现异常
- byName 通过名称查找对象,如果找不到对应的id或name的对象,会出现空指针异常
- constructor 通过构造方法装配
linux查看日志文件
tail
这个是我最常用的一种查看方式
命令格式: tail必要参数[文件] -f 循环读取 -q 不显示处理信息 -v 显示详细的处理信息 -c<数目> 显示的字节数 -n<行数> 显示行数 -q, --quiet, --silent 从不输出给出文件名的首部 -s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
用法如下:
tail -n 10 test.log 查询日志尾部最后10行的日志; tail -n +10 test.log 查询10行之后的所有日志; tail -fn 10 test.log 循环实时查看最后1000行记录(最常用的)
一般还会配合着grep用,例如 :
tail -fn 1000 test.log | grep '关键字'
如果一次性查询的数据量太大,可以进行翻页查看,例如:
tail -n 4700 aa.log |more -1000 可以进行多屏显示(ctrl + f 或者 空格键可以快捷键)
sleep和wait的区别
-
调用对象不同
wait() 由锁对象调用
sleep() 由线程调用
-
锁使用不同
执行wait后,自动释放锁
执行sleep后,不会释放锁
-
唤醒机制不同
执行wait后,可以被通知唤醒
执行sleep后,只能等待时间结束后,自动唤醒
深拷贝和浅拷贝的区别
1、浅拷贝:将原对象或原数组的引用直接赋给新对象,新数组,新对象数组只是原对象的一个引
用。
2、深拷贝:创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过
来,是“值”而不是“引用”。