A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本篇是我和朋友出去面试积累的面试题,希望能帮助到即将出去面试的朋友们(java)


4-20中午 得逸信息电话面试

spring springmvc springboot的区别
    spring是一个基础框架,通过ioc容器和aop的代理模式来简化企业级应用的开发
    spring mvc 是spring 处理web层请求的一个模块
    springboot 常用的基础框架组合起来,避免依赖版本冲突,提供默认的配置,

mysql 一级二级缓存  
    一级缓存,也称本地缓存,sqlSession级别的缓存。一级缓存是一直开启的;与数据库同一次回话期间查询到的数据会放在本地缓存中
        一级缓存失效的四种情况
            sqlSession不同
            sqlSession相同,查询条件不同
            sqlSession相同,在两次相同查询条件中间执行过增删改操作
            sqlSession相同,手动清空了一级缓存
    二级缓存:全局缓存;基于namespace级别的缓存。一个namespace对应一个二级缓存。
        工作机制
            一个会话,查询一条数据,这个数据会被放在当前会话的一级缓存中
            如果会话被关闭了,一级缓存中的数据会被保存带二级缓存。新的会话查询信息就会参照二级缓存
            不同的namespace查出的数据会放在自己对应的缓存中
        使用步骤
            开启全局缓存配置。<settings><setting name="cacheEnabled" value="true"/></settings>
            因为是namespace级别,需要搭配每个xxxMapper.xml中配置二级缓存<cache></cache>
                eviction:缓存的回收策略:
                    LRU – 最近最少使用的:移除最长时间不被使用的对象。
                    FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
                    SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
                    WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
                flushInterval:缓存刷新间隔。缓存多久清空一次,默认不清空。设置一个毫秒值。
                readOnly:是否只读。
                    true
                        mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。
                        mybatis为了加快获取速度,直接就会将数据在缓存中的引用交给用户。不安全,速度快。
                    false
                        mybatis觉得获取的数据可能被修改。mybatis会利用序列化和反序列化的技术克隆一份新的数据给用户。安全、速度快
                size:缓存放多少元素
                type:指定自定义缓存全类名,实现cache接口即可
        pojo需要实现序列换接口
        缓存首先一进来去查二级缓存,二级缓存没有去找一级缓存,一级缓存没有去找数据库。二级缓存----->一级缓存-------->数据库

jpa hibernate mybatis的区别
    jpa是一种orm规范
    Hibernate是一个完整的ORM框架,常规CRUD我们不需要写一句SQL,性能不好控制
    MyBatis 并不是一个完整的ORM框架,因为我们还需要自己去写全部SQL,更灵活

Redis持久化机制
    持久化流程
        客户端向服务端发送写操作---服务端接收写请求---服务端调用write---操作系统将数据转移到磁盘控制器---磁盘控制器将数据保存到硬盘
    RBD机制
        在指定的时间间隔内将内存中的数据集快照写入磁盘,也是默认的持久化方式,文件名dump.rdb
        触发机制
            save命令,该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止
            bgsave,通过子进程,在后台异步进行快照操作,
        优势
            rdb文件紧凑,全量备份,非常适合备份和灾难恢复
            恢复大量数据时速度比aof快
        劣势
            子进程备份时,父进程修改的数据可能丢失
    AOF机制
        redis将每一个写命令都追加到文件中
        当aof文件过大的时候,redis提供bgrewriteaof命令将内存中的数据以命令的方式保存到临时文件中,fork出一条新进程将文件重写
        三种触发机制
            always  每次数据变更都会立即记录
            everysec 每秒记录,如果一秒内宕机,有数据丢失
            no  不同步
        优点,数据完整性好,适合做备份紧急恢复
        缺点,文件大,相比rbd性能稍差,
    通常是结合起来使用
有哪些SQL优化经验
    只查需要的数据
    尽量减少子查询,使用关联查询(left join,right join,inner join)
    尽量避免在where子句中使用!=,<>,导致索引失效
    避免在where子句中进行null值判断,导致索引失效

简述一下restful
    一种软件架构风格、设计风格,它主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次
    方便地通过请求方式可以判断对资源的操作,使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作,分别对应 添加、 删除、修改、查询
    使用Http头声明序列化格式
    使用含义清晰的Http状态码处理错误,201创建成功,401请求需要验证,403没权限拒绝服务等
    可以用一个URI(统一资源定位符)指向资源,即每个URI都对应一个特定的资源
    无状态的,即所有的资源,都可以通过URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变
   
   
4-20 下午,文辉海思
怎么防止消息丢失
    生产者丢失
        开启rabbitmq的事务,如果没收到就会回滚,发送失败会重试,消耗性能,影响吞吐量
        confirm模式,每次消息都会分配一个唯一id,写入rabbitmq回传一个ack消息,如果没有处理这个消息回调nack接口,告诉你消息失败可以重试
            也可以在内存里维护每个消息id的状态,如果超过一定的时间没接收到这个消息可以重发
        事务是同步的会阻塞,confirm是异步的,
    rabbitmq丢失了数据
        开启rabbitmq的持久化,创建queue的时候设置为持久化的,发送消息的时候将消息的deliveryMode设置为2,就是将消息设置为持久化的
        持久化了才会发送ack,rabbitmq挂了重启也会重试,恢复数据
    消费端丢失数据
        关闭自动ack,每次消费者处理完数据调用api进行ack确认,如果接收数据没有处理就挂了,rabbitmq会把这个消息分配给别的consumer去处理

怎么防止超卖
    加悲观锁,修改数据的时候,排斥外部请求
        会造成阻塞,导致连接数用尽,系统陷入异常
    请求放入队列,先进先出,可能会撑爆内存,可能是系统异常
    乐观锁思路
        这个数据所有请求都有资格去修改,但是会获得一个该数据的版本号,只有版本号符合的才能更新成功,其他的返回抢购失败

什么情况下回出现消息的重复消费
    一般出在任务超时,或者没有及时返回状态,引起任务重新入队列,重新消费!  
    在rabbtimq里连接的断开也会触发消息重新入队列。  
怎么防止消息重复消费
    使用消息队列如何保证幂等性
    调用的接口设置成幂等的
    或者用一个第三方介质做消息记录,
        redis给消息分配一个全局id,消费过消息就以key-value存入redis,消费者消费前先去redis查有没有消费记录
        
Linux查询端口占用、性能的命令
    netstat -tunlp        tn显示tcp、udp端口,n显示数字地址,l仅显示监听端口,p显示进程的pid
    查看内存 free  查看cpu核心 cat /proc/cpuinfo    查看cpu使用率 top
    ps -a | grep 筛选条件   ps命令查看进程  -a显示当前终端下的所有,-e显示系统内的所以,-f使用完整的格式显示
   
查询需要优化的SQL,怎么分析该条SQL哪里有问题
    慢查询日志,然后用Explain查看执行计划
    -- type: 访问类型
        -- system --> const --> eq_ref --> ref --> range --> index --> all
说一下redis高可用
    redis的高可用就是redis的持久化
说一下分布式锁
    分布式系统中防止线程相互干扰
    redis的set  nx命令,只有在key不存在的情况下才能成功
        加锁,如果给一个商品加锁,key命名为lock_商品id,value设置成线程id,执行set(lock_商品id,线程id,30,nx),返回1该线程得到锁,其他的线程会执行不成功返回0
        解锁当线程操作完,先判断value是不是equals线程id然后执行del(lock_商品id)进行解锁
        锁超时
        如果一个得到锁的线程释放锁之前挂掉,会造成死锁,setnx的key必须设置一个超时时间,expire(lock_商品id,30)
        避免线程执行时间很慢而锁过期,可以开一个守护线程执行expire给锁续航
        
说一下vue
    将视图和数据实现双向绑定,组件化
    vue-router 使用 path 属性过程中,使用动态路径参数
    v-model用于表单数据的双向绑定,其实它就是一个语法糖,这个背后就做了两个操作:
        v-bind绑定一个value属性
        v-on指令给当前元素绑定input事件
    vue绑定事件
        通过指令 v-on:事件名=“函数名”绑定事件 eg:<button v-on:click="doThis"></button>
        通过语法 @事件名=“函数名”绑定事件 eg:<button @click.stop="doThis"></button>
    vue的生命周期
        它可以总共分为11个阶段:
            创建前/后(1.beforeCreate, 2.created),
            载入前/后(3.beforeMount, 4.mounted),
            更新前/后(5.beforeUpdate, 6.updated),
            销毁前/后(7.beforeDestroy,8.destroyed),
            激活时/未激活时(9.activated, 10.deactivated),
            当捕获一个来自子孙组件的错误时被调用(11.errorCaptured)

幂等是什么
    HTTP 幂等方法,是指无论调用多少次都不会有不同结果的 HTTP 方法
    get、delete、put是幂等的,post新建不是幂等

4-21外包顺丰
如何完成权限校验
    首先我们有权限管理这个服务,管理用户的各种权限,及可访问路径等
    在zuul网关中利用pre过滤器,拦截一切请求,在过滤器中,解析jwt,获取用户身份,查询用户权限,判断用户身份是否可以访问当前路径
    微服务地址暴露了,绕过网关直接访问微服务怎么办
        微服务都做了严格的服务间鉴权处理,任何对微服务的访问都会被验证是否有授权,如果没有则会被拦截

使用过aop吗,aop的实现原理
    面向切面编程,为分散的对象引入公共行为,如记录运行时间,打印日志,事务管理等
    spring会自动根据代理对象是否实现了接口来决定使用哪种代理方式,有接口用jdk的代理,没接口用cglib的代理
    多个通知和切入点的配置关系称为切面
    使用
        编写通知类,即增强的功能 在通知类上使用注解@Component装配bean到spring容器,并且使用@Aspect注解标注这是一个通知类
        通知类的方法上注解前置/后置/环绕通知,value属性就是切点的AspectJ表达式
        可以在通知类上创建空方法,加上@Pointcut注解标注这是一个切点,value属性就是AspectJ表达式,方便同一切点名的复用
   
        
mybatis的分页
    Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页
    分页插件工具PageHelper
        开启分页PageHelper.startPage(page, rows);
        解析分页结果PageInfo<Brand> info = new PageInfo<>(brands);//根据查询结果计算总条数,总页数
        返回return new PageResult<>(pageInfo.getTotal(), pageInfo.getPages(), brands)//总条数,总页数,当前页数据
        
mybatis的一对多,mybatis中的多表查询
    一对一
        在一方添加对方的实体类型作为属性
        需要自定义ResultMap结果集映射多表关系        
        association用于对一的映射,配置添加的实体类信息
        关联查询,都需要显示的开启自动映射autoMapping=true
    一对多
        在一方添加多方的list属性集合
        需要自定义ResultMap结果集映射多表关系
            collection用于一对多的映射,javaType为List集合类型,ofType为list集合的泛型
    多对多的查询
        引入中间关系,转化为一对多,
        
   



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马