2021-10-21面试题

这篇博客汇总了2021年10月21日的面试题,涵盖了GC垃圾回收机制、数据库索引的作用、Spring的IOC和DI、SpringMVC的处理流程、Mybatis的工作原理、SpringCloud微服务概念以及Redis的相关知识,还包括数据库优化和SQL安全等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

GC垃圾回收机制

 数据库索引的作用

spring:IOC和DI

springMVC

 什么是springmvc

springmvc的处理流程

 Mybatis

什么是mybatis?

Mybatis工作流程

resultType和resultMap的区别

              SpringCloud

分布式系统是什么?

微服务是什么?

微服务和分布式的区别是什么?

nacos

feign

 为什么要使用feign

sentinel

Nginx

                Linux常见命令

数据库及常用的sql优化

 什么是数据库的事务

 数据库的字段约束

 数据库的优化方案

什么是SQL攻击?如何解决

 Redis

哨兵机制(Sentinel):

集群(cluster):

概念

数据类型:


GC垃圾回收机制

在java中,堆被划分为两个不同的区域:新生代、老年代,新生代有三个分区:Eden、ToSurvivor、FromSurvivor,新生代使用复制算法完成回收,老年代使用标记算法。在易电源区执行第一次GC,用可达性分析算法分析死亡的对象被回收,存活的对象被分配到From区,然后再采用复制算法将Eden和From区一起清理,存活的被复制到to区,移动一次年龄加一,当年龄大于一定值的时候直接移动到老年区,年龄默认值是15。当老年代存满后,使用Full GC清理整个堆包括年轻代和老年代。

 数据库索引的作用

为了提高数据库的查询效率,给查询需要量大,字段值比较大的情况加索引,因为创建索引所占的空间比较大,所以不是所有条件都适合加索引。例如:如果每次都需要取到所有表记录,进行全表扫描;非唯一字段,例如“性别”这种大量重复的字段。

spring:IOC和DI

IOC:将对象的创建,对象的存储(map),对象的管理(依赖查找、依赖注入)交给了spring容器。

DI:组件之间的依赖关系由容器在应用系统运行期来决定,也就是容器动态的将某种依赖关系的目标对象实例注入到应用系统中的各个关联组件之间.

AOP:把系统分为核心关注点和横切关注点。核心主要处理业务逻辑,横切是权限验证,日志,事务处理。

AOP面向切面编程:切面:piontcut与point的组合

​                 连接点:程序执行过程中明确的点。

​                 通知:前置通知、后置通知、环绕通知、返回后通知、异常通知

​                 切点:提供一组规则来匹配Joinpoint

​                 目标对象:包含连接点的对象。也被称作被通知或被代理的对象。

​                 AOP代理:AOP框架创建的对象,包含通知。在spring中,AOP代理可以是JDK动态代理或者CGLIB代理。

​                 织入:组装方面来创建一个通知对象。这可以在编译时完成也可以在运行时完成。spring在运行时完成。

springMVC

 什么是springmvc

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架。通过把Model,View,Controller分离,把较为复杂的web应用分成逻辑清晰的几部分,是为了简化开发,减少出错。

springmvc的处理流程

1.浏览器发送请求,被前端控制器dispatcherservlet捕获。

2.dispacherservlet通过请求的url解析到请求资源标识uri,然后根据该uri调用handlermapping,获取对应的handler。

3.得到handler后,开始有handleradpter适配器进行操作。

4.handleradpter根据handler来调用controller控制器,开始处理请求,处理具体业务。

5.处理器处理完业务后会返回一个ModelAndView对象,Model是数据对象,View是个逻辑上的view。

6.ViewResolver视图解析器通过逻辑view查找实际的view。

7.dispacherservlet把model交给view进行视图渲染。

8.最后再把view返回给浏览器

 Mybatis

什么是mybatis?

MyBatis 是一款优秀的**持久层框架**,它支持定制化 SQL、存储过程以及高级映射。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

Mybatis工作流程

1.mybatis应用程序通过sqlSessionFactoryBuilder从mybatis-config.xml配置文件中构建出sqlSessionFactory。

2.sqlSessionFactory的实例直接开启一个sqlSession

3.再通过SqlSession实例获得Mapper对象

4.执行Mapper映射的SQL语句,完成对数据库的CRUD操作和事务提交

5.关闭sqlSession

   sqlSession是单线程对象,因为他是非线程安全的,是持久化操作的独享对象。

resultType和resultMap的区别

resultType是直接表示返回类型的,resultMap是对外部resultMap的引用,resultType和resultMap不能同时存在。

(1)返回类型属性是resultType时,Mybatis会将Map里面的键值对取出赋给resultType所指定对象对应的属性。

(2)返回类型是resultMap时,需要把它转化成对应的对象,通常在复杂查询中很有作用。

              SpringCloud

分布式系统是什么?

分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。

微服务是什么?

一种软件开发技术- 面向服务的体系结构(SOA)架构样式的一种变体,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够独立地部署到生产环境、类生产环境等。

微服务和分布式的区别是什么?

微服务相比分布式服务来说,它的粒度更小,服务之间耦合度更低,由于每个微服务都由独立的小团队负责,因此它敏捷性更高,分布式服务最后都会向微服务架构演化,这是一种趋势, 不过服务微服务化后带来的挑战也是显而易见的,例如服务粒度小,数量大,后期运维将会很难。

nacos

概念:是一个应用于服务注册与发现、配置管理的平台

nacos服务注册及健康检查状态

nacos服务客户端启动时会每隔一段时间(默认5秒)向nacos发送心跳包,nacos注册中心15秒内没有检测到心跳包会默认认为nacos处于一种不健康状态,30秒还收不到心跳包则认为这个服务不可用。

feign

feign远程调用,核心就是通过一些列的封装和处理,将以Java注解的方式定义的远程调用API接口,最终转化成HTTP的请求形式,将HTTP的请求的响应结果,解码成JAVA Bean,返回给调用者。

 为什么要使用feign

基于Feign可以更加友好的实现服务调用,简化服务消费方对服务提供方法的调用。

项目中如何实现服务的调用

一种是RestTemplate,一种是OpenFeign,这两种服务在进行服务调用时,都可以借助Ribbon实现负载均衡。

sentinel

为什么要限流,Sentinel限流常用算法

限流的目的是为了保证服务更加可靠的运行,不至于系统在遇到突发流量是,出现系统宕机的现象。常用的限流算法有:计数器发,滑动窗口法、漏斗算法、漏桶算法。

网关层面如何实现负载均衡以及常用算法?

网关层面的负载均衡我们借助了Ribbon进行实现,常用算法有轮询,权重,随机,hash等,这个算法都可以在配置中心进行配置,然后基于业务不同,做动态调整。

Nginx

什么是Nginx

Nginx是一个web服务器和反向代理服务器,主要功能是:1.反向代理服务器 2.实现负载均衡 3.虚拟主机

Nginx常见命令

启动   在nginx的安装包路径下cmd:start nginx

停止    nginx -s stop

查看版本  nginx -v

 反向代理机制与正向代理机制

反向代理服务器位于用户与目标服务器之间,用户不知道真实的服务器地址,保护了服务器端的地址。

正向代理位于客户端与原始服务器端,用户了解访问的服务器到底是谁,保护了用户的信息。

                Linux常见命令

数据库及常用的sql优化

 什么是数据库的事务

事务就是为了保证原有事务的完整性和一致性,逻辑上的一组操作,要么都执行,要么都不执行。

原子性:一个事物是不可分割的整体,要么成功要不失败

一致性:事务必须是数据库从一个一致性状态到另一种一致性状态。

隔离性:一个事物的执行不能被其他事务所干扰。

持久性:一个事物一旦提交后对数据库的改变是永久的

 数据库的字段约束

主键约束:实现实体的完整性,值唯一,不能为空,且可以自动递增

外键约束:用于多表之间的查询该表组件作为另外张表的外键建立标语标志的关系

非空约束:保证该字段的值不能为空

唯一约束:列表的唯一性约束

检查约束:检查列的值是否满足一个boolean表达式

默认约束:给指定的字段可以设置默认值,不设置值事使用默认值而不是null

 数据库的优化方案

(1)查询时能不用*就不用,尽量写全字段名。

(2)索引不是越多越好,每个表控制在6个索引以内,,范围where条件的情况下索引不起作用

(3)大部分情况连接效率远大于子查询。

(4)多用explain和profile分析查询语句,判断是什么原因使SQL慢

(5)有时候1条大的SQL可以分成几个小的SQL顺序执行,速度快。

(6)每隔一段时间用alter table 表名 engine=innodb优化表

(7)连接时注意:小表jion大表的原则

(8)查看慢查询日志,找出执行时间长的SQL进行优化

(9)尽量免使用OrderBy

(10)因为where自居后面的条件执行顺序是从右到左,所以尽量把能过滤掉大部分数据的条件写在后面

什么是SQL攻击?如何解决

**SQL注入:**就是通过把SQL命令插入到web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务期执行恶意的SQL命令。

**解决方法**:1.对用户的输入进行校验,通过正则表达式或限制长度,对单引号和双“-”进行转换

​                    2.不适用动态拼接SQL,直接使用存储过程进行存储

​                    3.不使用管理员权限的数据库连接

​    ·                4.对重要信息进行加密或hash掉密码和敏感的信息

​                     5.对异常信息进行自定义包装,把异常信息存放在独立的表中

 Redis

哨兵机制(Sentinel):

        为了解决主从复制架构中出现的宕机的情况。管理多个Redis服务器,提供了监控、提醒以及自动故障的转移功能。为Redis提供高可用性解决方案。

集群(cluster):

        单台服务器资源有限,cpu和IO资源可以通过主从复制,进行读写分离,把一部分CPU和IO压力转移到从服务器上。每台服务器只负责一部分任务,讲这些服务器构成一个整体就是集群。

概念

Redis是一个key-value存储系统,是一个分布式缓存数据库,非关系型数据库支持数据的持久化。

数据类型:

String:普通的key-value存储

Hash:是一个键值(key,value)对集合

set:无序的去重集合。

list:有序可重复的集合

zset:带权值的无序集合。zset元素还另有一个数字代表权值,集合通过权值进行排序。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值