java:
1、Redis 缓存,io创建文件夹或者多线程的问题
缓存是数据交换的缓冲区,是数据存储的临时地方,相对来说他的读写性能比较高
怎么解决缓存的不一致性:
在单体系统里,我们可以将这两个操作放在一个事务里来保证,如果在分布式系统下则可以通过TCC等分布式事务来保证
如果对数据的一致性需求低,则可以使用默认的内存淘汰机制,对于一致性高的需求则使用主动更新的策略,并以超时删除作为兜底的方案
在使用Redis创建文件夹命令时,需注意以下几点:
Redis创建的文件夹是虚拟的,实际上并不会在文件系统中创建一个新的文件夹。
Redis的文件夹只是一种逻辑上的组织方式,用于将相关的键值对进行分组管理。
在Redis中创建的文件夹可以包含其他的文件夹和键值对,可以根据需要进行嵌套和扩展。
一、线程安全问题
线程安全是多线程编程中最常见的问题之一。当多个线程同时访问共享资源时,如果没有适当地进行同步,可能会导致数据的不一致。解决线程安全问题的常用方法有:
使用互斥锁:synchronized关键字可以保护共享资源的访问,并确保同一时间只有一个线程可以访问该资源。当一个线程进入synchronized代码块时,其他线程将被阻塞,直到该线程释放锁。
二、死锁问题
当两个或多个线程因为等待对方释放资源而无法继续执行时,就发生了死锁。解决死锁问题的方法有:
避免使用嵌套锁:当一个线程持有一个锁时,又尝试获取另一个锁,可能导致死锁。为了避免这种情况,在设计多线程程序时,尽量避免使用嵌套锁。
使用定时锁:在获取锁时,可以设置一个超时时间。
三、线程间通信问题
在某些情况下,多个线程之间需要进行通信,以协调彼此的动作。解决线程间通信问题的方法有:
使用等待-通知机制:通过wait()和notify()等方法实现线程间的等待和唤醒操作。
2、Springboot自动配置原理
Spring Boot自动配置的实现原理基于Spring Framework的条件化配置特性。
当Spring Boot应用程序启动时,它会检查应用程序中所包含的依赖项,并根据依赖项选择性地为应用程序自动配置Spring Bean及其相关的属性。
具体来说,Spring Boot条件化配置使用了Spring Framework的@Conditional注解机制,根据实现了Condition接口的类的结果来决定是否需要应用配置。如果实现的Condition接口返回true,则将自动配置相关Bean,否则不配置。
3、多线程实际操作过吗,线程的创建方法,线程的返回值
创建方式1:继承Thread类
实现Runnable接口
获取返回值:
使用 join() 方法,getResult(); // 获取结果
使用 CountDownLatch中await() 方法
Java 的 Future 和 Callable 接口来实现线程的返回值
4、如何用Io创建文件;
Java IO之5种创建写入文件的方法
Files.new BufferedWriter(Java 8)
Files.writer(Java 7推荐)
PrintWriter
File.createNewFile
FileOutputStream.writer(byte[] b)管道流
5、List如何排序?
使用lambda表达式。
java.util包中的Collections.sort()
Comaprator的comparing()方法进行排序
6、会前端吗? VUE方面
其实Vue实例的生命周期,主要分为三个阶段,分别为
挂载(初始化相关属性,例如watch属性,method属性)
beforeCreate
created
beforeMount
mounted
更新(元素或组件的变更操作)
beforeUpdate
updated
销毁(销毁相关属性)
beforeDestroy
destroyed
7、redis和数据库同步;
暴力方法:当我们对业务库做了修改,我们可以通过同步更新的方式去同步,也可以通过暴力删除Redis的方式去同步。因为删除Redis,会再次查询数据库的最新数据。
最佳方法:写线程只负责改数据库,不要去参与Redis同步的问题,Redis同步交给一个严格顺序的pipeline解决。这个pipeline的流程是,当数据库发生数据变化会立即产生binlog日志,我们可以借助阿里的canal组件去监听binlog,同时解析binlog,将解析的结果以消息的方式发送给MQ。MQ要保证严格顺序,再通过消费者去消费消息,将最新的数据覆盖更新到Redis,到此就能解决缓存的同步。
8、数据库优化问题
定位慢SQL然后并优化
避免索引失效
Sql语句调优
合理的数据库设计(三范式设计)
分表
9、mybatis事务,js方面的问题,分布式事物
MyBatis的事务Transaction的接口设计以及其不同实现JdbcTransaction和 ManagedTransaction; 对数据库的事务而言,创建(create)、提交(commit)、回滚(rollback)、关闭(close)。对应地,MyBatis将事务抽象成了Transaction接口
10、Springboot 和 SpringMVC 的区别
springBoot只是一个配置工具,整合工具,辅助工具
springmvc是框架,项目中实际运行的代码
Spring框架就像一个大家族,有众多衍生出的产品例如Boot,security,jpa等等,但他们的基础都是SpringIOC和AOP,ioc提供依赖注入的容器,aop解决了面向横切面的编程,然后再次两者的基础上实现了其他延伸产品的高级功能
SpringMVC提供了一种轻度耦合的方式来开发web应用,他是Spring中的一个模块,是一个Web框架,通过DispatcherServlet,ModelAndView,和ViewResolver,开发Web应用变得很容易
SpringBoot实现了自动配置,降低了项目的搭建难度
对使用者来说,换用SpringBoot以后,项目的初始方法变了,配置文件变了。另外就是不需要单独安装Tomcat这类容器服务器,maven打出jar包直接拍起来就是个网站,但是你最核心的业务逻辑实现与业务流程实现没有任何变化。
11、单例模式如何保证只生产一个类
实现单例模式主要由如下几个关键点:
(1)构造函数不对外开放,一般为private,使外部不能new出这个对象
(2)通过一个静态方法或者枚举返回单例类对象
(3)确保单例类的对象有且只有一个,尤其在多线程环境下
(4)确保单例类对象在反序列化时不会重新构建对象
oracle的分页:ROWNUM函数实现分页
如何理解线程不安全,map那些是线程安全的
多个线程同一时刻对同一个全局变量(同一份资源)做写操作(读操作不会涉及线程安全)时,如果跟我们预期的结果一样,我们就称之为线程安全,反之,线程不安全。
JAVA中线程安全的map有:Hashtable、synchronizedMap、ConcurrentHashMap。
springboot的事务传播机制
Required(默认)
Requires_new
Nested
在使用Spring事务时,需要注意以下几点:
事务传播机制的选择要根据业务场景来确定。
如果内层方法和外层方法在同一个事务中,那么内层方法抛出异常时,异常应该由外层方法来处理。
如果内层方法和外层方法在不同的事务中,那么内层方法抛出异常时,不会影响到外层方法。
NESTED传播机制是一种比较特殊的传播机制,需要慎重使用。
在实际开发中,我们需要根据不同的业务场景选择合适的事务传播机制,并且要根据实际情况来处理事务异常,以保证事务的正确执行
说一下使用到的设计模式mybatis的#号和S符的区别
#{} 为参数占位符 ?,即sql 预编译,能防止sql 注入
${} 为字符串替换,即 sql 拼接,不能防止sql 注入
mysql的如何查出两个名称相同的信息
GROUP BY和HAVING子句来查询重复名字
12、侧重数据结构和算法、怎么遍历二叉树、怎么遍历文件夹
深度优先遍历:先往深走,遇到叶子节点再往回走。
前序遍历(递归法,迭代法)中左右
中序遍历(递归法,迭代法)左中右
后序遍历(递归法,迭代法)左右中
这里的前中后是指中间节点的遍历顺序
广度优先遍历:一层一层的去遍历。
层次遍历(迭代法)
一、使用递归遍历文件夹
二、非递归遍历文件夹
13、工厂模式在spring中的体现
implments FactoryBean<T>:泛型指工厂要生产谁,就是谁
14、mysgl中聚合函数,
SUM()、AVG()、MAX()、MIN()、COUNT()
linux 常用命令、ls命令、cd命令、pwd命令、mkdir命令、rm命令、rmdir命令、mv命令、cp命令、cat命令
ps kill tail
@Autoware 和@Resource 的区别
1、@Autowired默认按byType自动装配,而@Resource默认byName自动装配。
2、@Autowired只包含一个参数:required,表示是否开启自动准入,默认是true。而@Resource包含七个参数,其中最重要的两个参数是:name 和 type。
15、jdk8 里面接口默认实现是怎么做的
使用default来修饰的称之为默认方法,默认方法通过实例对象来调用
16、redis 持久化策略反射机制
Redis提供了两种主要的持久化机制,分别是RDB快照(Snapshotting)和AOF日志(Append-Only File)。
17、消息列队使用
Kafka、MQ、Redis
19、微服务之间的通讯方式
同步通信:微服务之间通过请求-响应的方式进行通信,例如RESTfulAPI和RPC。
异步通信:微服务之间通过消息队列进行异步通信,例如Kafka和RabbitMQ。
20、Jvm调优,分布式锁,集群,修饰符
调优的步骤大致可以分为:
1.熟悉业务场景,了解当前业务系统的要求,是吞吐量优先还是响应时间优先;
2.选择合适的垃圾回收器组合,如果是吞吐量优先,则选择ps+po组合;如果是响应时间优先,在1.8以后选择G1,在1.8之前选择ParNew+CMS组合;
3.规划内存需求,只能进行大致的规划。
4.CPU选择,在预算之内性能越高越好;
5.根据实际情况设置升级年龄,最大年龄为15;
6.设定日志参数:
分布式锁是控制分布式系统之间同步访问共享资源的一种方式。
集群是在局域网或互联网中连接多台计算机,通过软件和硬件来实现资源共享和任务分配,共同完成一个任务的高性能计算系统。
Java修饰符是用来修饰类、变量、及方法的访问限定或类型限定,主要有以下几个:public,protected,private,default,static,final,abstract,transient,volatile
21、list和 map
List特点:元素有放入顺序,元素可重复。
List:1、可以允许重复的对象。
2、可以插入多个null元素。
3、是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
4、常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,
Map:1、不是collection的子接口或者实现类。Map是一个接口。
2、Map的每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
3、TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
4、Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
5、Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)。
22、高级java: jvm垃圾回收机制 垃圾回收算法 垃圾回收器,
jvm的垃圾回收机制是什么:jvm的垃圾回收机制是垃圾收集器。GC基本原理:将内存中不再被使用的对象进行回收;GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、老年代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停。
什么是垃圾回收:java自带垃圾回收器,垃圾回收是指不定时去堆内存中清理不可达对象。
为什么需要垃圾回收:如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。
jvm垃圾回收原理:在JVM运行时数据区存在一个堆区,堆是一个巨大的对象池。在这个对象池中管理着数量巨大的对象实例,而池中对象的引用层次,有的是很深的。一个被频繁调用的接口,每秒生成对象的速度,是很大的,同时,对象之间的关系,形成了一张巨大的网。
微服务组件都用了哪些,redis缓存雪崩 存击穿 缓存穿透,spring bean有哪些作用域是否是线程安全的。docker容器,代码安全性测试,微服务组件网关。
1.服务注册与发现组件:nacos和Eureka。2. API网关:Nginx 3. 配置管理组件(Spring Cloud Config和Consul) 4. 消息队列(MQ、Kafka)
Spring 的 bean 作用域(scope)类型
1、singleton:单例,默认作用域。
3、request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。
4、session:会话,同一个会话共享一个实例,不同会话使用不用的实例。
Bean是否线程安全:
最终回答:Spring中的Bean是否线程安全 和Spring无关。
23、Orade存储过程,树形,分页,事物,spring 设计模式,单例模式,参数传递接收,文件下载上传,云存储,微服务注册中心,服务调用
create or replace procedure NoParPro
工厂模式、单例模式、代理模式、适配器模式、模板模式
24、mybatis怎么定义全局sql。整个程序的全局变量怎么设置
在 Mapper接口中定义相关的 CRUD方法
扩展 AutoSqlInjector inject 方法,实现 Mapper接口中方法要注入的 SQL
在 MP全局策略中,配置 自定义注入器
xml配置方式:把自定义的MySqlInjector 配置到全局策略中