1.能说一下io流都有哪些分类吗
- 按照流向分类:输入流,输出流
- 按照处理数据不同分类:字节流,字符流
- 按照功能分类:节点流,处理流
2.字节流如何转为字符流
public class Test {
public static void main(String[] args) throws IOException {
//1.取得终端对象
File file = new File("C:"+ File.separator+"Users"+
File.separator+"Lenovo"+ File.separator+"Desktop"+ File.separator+"Test.txt");
//2.取得输出流
OutputStream outputStream = new FileOutputStream(file);
//3.进行数据输入输出
OutputStreamWriter out = new OutputStreamWriter(outputStream);
out.write("你好");
//4.关闭流
out.close();
}
}
3.说一下io流在项目中的应用,以及应用时的流程
- 在项目中的应用主要是文件的上传一类的功能
- 文件上传的流程:
- 通过文件输入流FileInputStream将文件从本地写入到内存中
- 判断服务器存储上传文件的文件目录是否存在,不存在则通过File类中的mkdirs方法创建目录
- 获取该目录路径
- 通过文件输出流FileOutputStream将文件从内存中输出到服务器中
- 将文件在服务器中的路径存储到数据库中
4.说一下Spring的两大特性
- Spring的大特性为IOC(控制反转)和AOP(面向切面编程)
- IOC是控制反转,是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。
- AOP是面向切面编程,当需要为多个不具有继承关系的对象引人同一个公共行为时,例如日志、安全检测等,我们只有在每个对象里引用公共行为,这样程序中就产生了大量的重复代码,程序就不便于维护了,所以就有了一个对面向对象编程的补充,即面向切面编程,AOP是对OOP(面向对象)增强,如果说OOP是纵向的,AOP则是横向的,它可以在不修改源码的情况下对程序进行增强
5.说一下Spring的常用注解
- @Autowired:自动封装,默认使用byType,根据类型匹配
- @Qualifier: 以指定名字进行匹配
- @Resource:先匹配set方法的名字,匹配不上再匹配方法参数列表的名字,如果还是匹配不上就会转换为byType,根据类型匹配
- @Component :标注一个普通的spring Bean类
- @Repository:标注一个DAO组件类
- @Service:标注一个业务逻辑组件类
- @Controller:标注一个控制器组件类
6.在使用mybatis时如何避免sql注入
- 在往sql语句中传入值时使用#{}而不是${},因为${}是拼接,所以会有被sql注入的风险,而#{}则是预编译,相当于jdbc中的PreparedStatement,所以不会被sql注入
7.说一下mybatis的二级缓存
- Mybatis提供了缓存策略,通过缓存策略来减少数据库的查询次数,从而提高性能
- Mybatis中的缓存分为一级缓存和耳机缓存
- 一级缓存是SQLSession级别的缓存,也是Mybatis默认开启的缓存级别,当SQLSession去执行commit操作时会清空SQLSession中的一级缓存
- 二级缓存是Mapper映射级别的缓存,需要手动开启,多个SqlSession去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨SqlSession的
8. redis的五个基本数据类型是什么
- String 字符串
- Hash 散列
- List 列表
- Set 无序集合
- Sorted Set(ZSet) 有序集合
9.redis中怎么给数值设置过期时间
- expire key 时间(秒) : 可以给已有的key设置过期时间
- setex key 时间 值 : 创建key的时候指定过期时间
10.说明一下redis中关于淘汰和逐出的机制
- Redis是内存级的数据库,所有的数据都存在内存中
- 当内存不足时再去进行数据的插入的操作时,redis则会执行淘汰策略(淘汰未过期的数据)
- 检测带有时效性的数据进行淘汰(一般是有定时,会过期的数据的)
- volatile-lru:挑选最近最少使用的数据淘汰(最久没有使用的键)
- volatile-lfu:挑选最近使用次数最少的数据淘汰(使用频率最少的键)
- volatile-ttl:挑选将要过期的数据淘汰
- volatile-random:任意选择数据淘汰
- 检测全库的数据进行淘汰
- allkeys-lru:挑选最近最少使用的数据淘汰
- allkeLyRs-lfu::挑选最近使用次数最少的数据淘汰
- allkeys-random:任意选择数据淘汰,相当于随机
11.说一下你对nacos的理解
- Nacos是阿里巴巴开发的一款SpringCloud的开源组件,在SpringCloud中起到服务注册中心和配置中心的作用
12.OpenFeign是通过什么协议进行远程调用的
13.分布式开发中有哪些方式去实现同步或异步的通信
14.在SpringCloud框架中Gateway起到什么作用
- Gateway在SpringCloud框架中起到网关的作用,是所有微服务的统一入口
- 它起到了路由,权限控制,限流的作用
15.微服务架构和单体架构有什么区别
- 单体架构所有的模块全都耦合在一块,代码量大,维护困难,微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。
- 单体架构所有的模块都共用一个数据库,存储方式比较单一,微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。
- 单体架构所有的模块开发所使用的技术一样,微服务每个模块都可以使用不同的开发技术,开发模式更灵活。
16.如何实现服务与服务之间的负载均衡
17.常用的sql优化方法有哪些
- 避免使用select *
- 选择最合适的字段属性
- 尽量把字段设置为NOT NULL
- 使用连接(JOIN)来代替子查询(Sub-Queries)
18.解释一下数据库中的乐观锁和悲观锁的概念,以及何时使用乐观锁和悲观锁
- 当一个数据被多个线程所共同使用,且线程并发执行时,我们需要保证保证该数据的准确性,既一个线程对数据的操作不会对另一个线程产生不合理的影响。实现的手段基本上是对数据加锁,当线程要对数据进行操作时必须获得锁后再进行操作。锁可分为乐观锁和悲观锁。
- 乐观锁,总是乐观地假设最好的情况,每次去拿数据的时候都认为别人不会修改这个数据,所以不会上锁,只会要对数据进行更新时判断一下在此期间(拿到数据到更新的期间)别人有没有去更改这个数据
- 悲观锁,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁
- 在乐观锁与悲观锁的选择上面,主要看下两者的区别以及适用场景就可以了。
- 响应效率:如果需要非常高的响应速度,建议采用乐观锁方案,成功就执行,不成功就失败,不需要等待其他并发去释放锁。乐观锁并未真正加锁,效率高。一旦锁的粒度掌握不好,更新失败的概率就会比较高,容易发生业务失败。
- 冲突频率:如果冲突频率非常高,建议采用悲观锁,保证成功率。冲突频率大,选择乐观锁会需要多次重试才能成功,代价比较大。
- 重试代价:如果重试代价大,建议采用悲观锁。悲观锁依赖数据库锁,效率低。更新失败的概率比较低。
- 乐观锁如果有人在你之前更新了,你的更新应当是被拒绝的,可以让用户从新操作。悲观锁则会等待前一个更新完成。这也是区别。
19.说一下mysql中char和varchar的区别
- char是定长字符串,varchar是变长字符串
- char在设定好大小后所占的空间不会改变,而varchar则会根据实际数据所占大小来调整自身大小
- 对于长度固定的数据,适合用char来存储,而对于长度非固定的数据则适合用varchar来存储
20.说一下Linux中的权限系统
- Linux下的文件权限类型一般分为r(可读),w(可写),x(可执行)
- LInux可以针对文件的拥有者,群组,其他组设置不同的权限
- 可通过chmod方法对文件的权限进行更改
chmod [可选项] <mode> <file...>
-
参数说明:
[可选项]
-c, --changes like verbose but report only when a change is made (若该档案权限确实已经更改,才显示其更改动作)
-f, --silent, --quiet suppress most error messages (若该档案权限无法被更改也不要显示错误讯息)
-v, --verbose output a diagnostic for every file processed(显示权限变更的详细资料)
--no-preserve-root do not treat '/' specially (the default)
--preserve-root fail to operate recursively on '/'
--reference=RFILE use RFILE's mode instead of MODE values
-R, --recursive change files and directories recursively (以递归的方式对目前目录下的所有档案与子目录进行相同的权限变更)
--help 显示此帮助信息
--version 显示版本信息
[mode]
权限设定字串,详细格式如下 :
[ugoa...][[+-=][rwxX]...][,...],
其中
[ugoa...]
u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示所有(包含上面三者)。
[+-=]
+ 表示增加权限,- 表示取消权限,= 表示唯一设定权限。
[rwxX]
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
[file...]
文件列表(单个或者多个文件、文件夹)
21.若依框架的定时任务是通过什么技术实现的