关于面试的准备
2024年3月10日
自我介绍
测试工程师岗位
关于简历
1.数据分发服务内部的统一分发模型采用了协程池、异步队列的方式实现对批量数据砍单后的单笔推单过程,提高了接口的处理能力,提高了系统的高可用和高性能;
协程池是一种并发处理的技术,它允许多个任务在同一个线程中交替执行,
从而提高了程序的并发性能。
通过使用协程池,数据分发服务可以同时处理多个推单任务,
而不需要为每个任务创建一个新的线程,从而减少了线程的创建和销毁的开销,
提高了系统的性能和吞吐量。
异步队列则是一种消息传递的机制,它允许生产者将消息放入队列中,
而消费者则可以异步地从队列中获取消息并处理。
通过使用异步队列,数据分发服务可以将批量数据砍单后的单笔推单任务放入队列中,
然后由协程池中的协程异步地从队列中获取任务并进行处理,
从而实现了任务的异步处理和高效分发。
2.数据入库时的数据库表设计。对于上游数据需要我们中台服务自己存储一份,需要设计合适的表来存储,根据一对一或一对多等关系建立合适的表,并对一些场景采用软删的方式来存储记录;
3.使用mokito进行单元测试,提升代码覆盖率,对部分代码进行重构;
4.熟练掌握git的日常开发使用
5.熟练基于Java8特性,如lambda表达式、方法引用、stream流的熟练使用
• Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作。
• stream流的特性
1. stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。
2. stream不会改变数据源,通常情况下会产生一个新的集合或一个值。
3. stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。
• stream可以由数组和集合创建,对其操作可以分为中间操作和终端操作
中间操作:每次返回一个新的流,可以有多个
终端操作:每个流只能进行一次终端操作,终端操作结束后流无法再次使用。
终端操作会产生一个新的集合或值!
6.登录注册:使用Redis实现验证码,token的存储,用自定义拦截器完成用户认证、并使用双重拦截器解决token刷新的问题;
首先,我们可以使用Redis来存储验证码和token,这样可以实现快速的读写操作,并且可以方便地进行过期时间的设置和管理。
然后,我们可以编写自定义拦截器来完成用户认证的逻辑。在用户请求到达后端服务之前,拦截器可以对请求中的token进行验证,并判断用户是否有权限访问相应的资源。
另外,当用户请求需要刷新token时,第一个拦截器可以验证用户的身份并生成新的token,然后将新的token存储到Redis中。接着,第二个拦截器可以再次验证用户的权限,并使用新的token来完成后续的操作。
从而提高系统的安全性和可靠性。
7.缓存一致性问题:深入了解缓存一致性问题的常用解决方案,并在系统中采用主动更新+超时剔除的缓存更新方案,满足较高的教据一致性需求;
8.接口调试:使用HttpPostGet{}工具类实现对HTTP不同方法的请求,最后将请求结果封装成JsonResult对象返回;
9.邮件通知:调用spring框架中的JavaMailSender组件实现对项目成员的邮件发送,当接口处于不同状态时发送邮件通知相关的项目成员进行处理;
10.用户权限的保存:通过Threadlocal配合拦截器来进行token的校验,判断当前用户是否处于登录状态,并解决了HTTP无状态的问题,达到服务器记住用户信息的效果;
11.熟练掌握Java基础,熟悉常用集合及底层数据结构、反射、类加载、 (了解)多线程;
12.熟练掌握JVM内存结构、JMM、GC算法、双亲委派机制、G1工作原理和对类加载过程深刻理解;
13.熟练掌握MySQL,深刻理解事物及其原理、存储引擎、索引、锁机制和各种机制等;
14.熟练掌握Redis,深刻理解数据类型、持久化策略、IO模型、哨兵机制、高可用、高性能原理等;
15.熟悉并发编程,熟悉掌握Java中各种锁机制、CAS、AQS、线程池、Threadloacl、JUC中常用工具类等实现原理;
16.熟练使用SSM、SpringBoot、SpringCloud等架深刻理解loC、AOP、Bean 生命周期、循环依赖、自动配置原理等;
17.对部分设计模式和设计原则有深入的理解,例如单例、工厂模板方法、策略、责任链模式等;
数据库
基础CRUD
1. 增
1. create user atguigu@'%' identified by '123456'; #创建用户
2. create database web; #创建数据库
3. create table a1(id int,name char(30)); #创建表 要加上字段名和数据类型
4. insert into a2(id,name,age) values(1,'zhangsan',21); #插入数据
2. 删
1. drop user atguigu@'%'; #删除用户
2. drop database web; #删除数据库
3. drop table a1; #删除数据库表
4. delete from a1 where id=5;
3. 改
1. update a1 set age=21 where id=3; #修改表中数据 年龄
2. alter table a1 rename a2; #修改表的名称
3. alter table a1 modify name char(50) #修改表的字段类型
4. alter table a1 change name username char(50) not null default ''; #综合体 change 修改的是字段名和类型 属于修改数据
5. alter table a1 add time datetime;
6. alter table a1 drop time; #添加和删除已有字段
4. 查
1. show databases; #查看所有数据库
2. show tables; #查看指定库内所有表
3. describe a1; #查看表中的字段结构
4. select user,password,host from mysql.user; #查看用户密码及登陆方式
5. 授权指令和取消授权
1. grant all on aa.a1 to atguigu@'%'; #授权给已有用户
2. grant all on aa.a1 to abc@'%' identified by '123456'; #创建用户并授权
3. revoke delete,drop on aa.a1 from abc@'%';    #取消授权
4. show grants for abc@'%';    #查看用户的权限
6. 启动和关闭
1. mysqld_safe & #启动数据库
2. mysqladmin -uroot -p123456 shutdown #关闭数据库
MySQL的常用函数总结
https://blog.csdn.net/zeng_ll/article/details/87706409
面试题
1. 返回姓李同学的个数 count(*) 返回指定匹配条件的行数
- select count(*) from student.report where Name like '李%' ;
2. 返回表中成绩大于80的前两名同学的名字,并按分数从大到小的顺序排列
- select result from report order by result desc limit 2; #order by 是指排序 desc是指降序 进行组合 limit 2 指取前两行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端