面试(二)

  1. Redis的5种基本数据结构,并简述其使用场景。

    Sring:存token,分布式锁

    set:抽奖

    Zset:排行榜

    list:消息队列

    Hash:用户信息

  2. 如何保障redis高可用?

    主从复制

    哨兵模式

    集群

    持久化

    客户端:使用连接池,熔断降级,重试机制

  3. 简述Nginx在项目中的作用

    反向代理

    防火墙

    负载均衡

    缓存

  4. MQ的核心作用?以及RocketMq有哪些部分组成?其中生产者有哪几种生产消息的模式?消费者有哪几种消费模式?

    作用:异步、削峰、解耦

    组成部分:Nameserve、brocker、生产者、消费者

    生产者生产模式:同步、异步、单向发送

    消费模式:集群消费、广播消费

  5. RocketMq如何保证消息不丢失?以及如何保证幂等性?

    生产者:同步发送+重试机制

    Broker:同步刷盘+同步主从复制

    消费者:手动确认+重试机制

    幂等性:将id和状态存到redis,每次处理前查redis,若状态为已完成则手动返回ack,若未完成则继续处理,处理完成改redis状态为已完成。

  6. 第一次从git拉代码用什么命令?简述Git提交代码得到步骤,写出对应的命令。

    git clone

    提交代码到本地:git commit

    拉取代码:git pull

    推送代码:git push

  7. 什么是缓存击穿、缓存雪崩、缓存穿透?如何解决?

    缓存击穿:一个热key过期,导致大量的请求直接打到数据库解决办法:设置永不过期或者在过期前提前刷新过期时间

    缓存雪崩:大量key同时过期但是大量请求直接打到数据库。解决办法:设置永不过期,提刷新过期时间,在设置过期时间时设置随机过期时间或其他算法。

  8. 你们公司项目中的开发步骤?从上线到开发有哪些环境?

    需求评审确认

    数据库设计

    后端开发步骤,实体类、Mapper、Service、Controller

    前端开发

    联调测试

    提交给测试人员测试

    打包部署上线

    环境:开发环境,测试环境,预发布环境,生产环境

  9. 过滤器和拦截器的区别以及使用场景?

对比维度 过滤器(Filter) 拦截器(Interceptor)
底层实现 Servlet 规范(Java EE 标准) Spring 框架(反射 + AOP 思想)
容器依赖 依赖于Web 容器(如 Tomcat) 依赖于Spring 容器(IOC)
执行时机 请求进入 Servlet 之前执行(更靠前) 请求进入 Controller 之前执行(在 Servlet 内部)
作用范围 对所有Web 资源有效(Servlet、JSP、静态资源) 仅对Spring MVC 的 Controller(Handler)有效
是否支持注入 Spring Bean 默认不支持(需要特殊包装) 天然支持(可直接注入 Service、Dao 等)
是否控制业务执行流程 只能决定是否放行拦截请求 可以精细控制请求前、请求后、视图渲染后全流程
常见场景 字符编码过滤、登录鉴权(全局)、GZIP 压缩 权限校验、日志记录、性能监控、事务管理

过滤器(Filter)是Servlet容器级别的,基于Servlet规范,在请求进入Spring MVC核心之前执行,能拦截所有Web资源(包括静态资源),但不依赖Spring环境,也无法直接注入Spring Bean;

而拦截器(Interceptor)是Spring MVC内部的,基于Spring的AOP思想,只拦截进入Controller的请求,天然支持注入Service等组件,并提供了 preHandlepostHandleafterCompletion三个更精细的阶段来控制业务逻辑。核心就一句话:Filter管得更早、更广但不依赖Spring,Interceptor管得更晚、更精细且完全融入Spring生态。通常全局非业务性的处理(如编码、跨域)用Filter,而需要结合业务和权限的精细化控制(如登录校验、日志审计)用Interceptor。

10.写出下列要求的命令:
(1)Linux下给出可以读写执行权限
chomd 7

(2)Linux下追踪日志命令

tail -f

(3)Linux下打包和解包的命令
tar zvf tar xvf

(4)Docker看日志的命令
docker logs

(5)进入Docker容器命令
docker exec -it

(6)构建Docker镜像命令
docker build

(7)第一天进入公司git获取代码命令
git clone

(8)git新文件提交文件命令

git commit(提交到本地)

git pull(拉取代码)

git push(推送代码)