面试(二)
-
Redis的5种基本数据结构,并简述其使用场景。
Sring:存token,分布式锁
set:抽奖
Zset:排行榜
list:消息队列
Hash:用户信息
-
如何保障redis高可用?
主从复制
哨兵模式
集群
持久化
客户端:使用连接池,熔断降级,重试机制
-
简述Nginx在项目中的作用
反向代理
防火墙
负载均衡
缓存
-
MQ的核心作用?以及RocketMq有哪些部分组成?其中生产者有哪几种生产消息的模式?消费者有哪几种消费模式?
作用:异步、削峰、解耦
组成部分:Nameserve、brocker、生产者、消费者
生产者生产模式:同步、异步、单向发送
消费模式:集群消费、广播消费
-
RocketMq如何保证消息不丢失?以及如何保证幂等性?
生产者:同步发送+重试机制
Broker:同步刷盘+同步主从复制
消费者:手动确认+重试机制
幂等性:将id和状态存到redis,每次处理前查redis,若状态为已完成则手动返回ack,若未完成则继续处理,处理完成改redis状态为已完成。
-
第一次从git拉代码用什么命令?简述Git提交代码得到步骤,写出对应的命令。
git clone
提交代码到本地:git commit
拉取代码:git pull
推送代码:git push
-
什么是缓存击穿、缓存雪崩、缓存穿透?如何解决?
缓存击穿:一个热key过期,导致大量的请求直接打到数据库解决办法:设置永不过期或者在过期前提前刷新过期时间
缓存雪崩:大量key同时过期但是大量请求直接打到数据库。解决办法:设置永不过期,提刷新过期时间,在设置过期时间时设置随机过期时间或其他算法。
-
你们公司项目中的开发步骤?从上线到开发有哪些环境?
需求评审确认
数据库设计
后端开发步骤,实体类、Mapper、Service、Controller
前端开发
联调测试
提交给测试人员测试
打包部署上线
环境:开发环境,测试环境,预发布环境,生产环境
-
过滤器和拦截器的区别以及使用场景?
| 对比维度 | 过滤器(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等组件,并提供了 preHandle、postHandle、afterCompletion三个更精细的阶段来控制业务逻辑。核心就一句话: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(推送代码)
评论