笔试题
时间要求: 40分钟内完成
1、考察并发,在TODO 的位置添加逻辑,【写伪代码】即可:
A、控制这个任务,在单机同一时刻仅运行一个任务执行,如何实现,伪代码即可?
B、在1的基础上,控制这个任务,在集群环境(20台机器)同时仅允许3个单机运行,如何实现,伪代码即可? 提示:借助分布式中间件
public class TestJob {
Public synchronized boolean doJob(){
// TODO 控制任务并发
// 执行业务逻辑
process();
return true;
}
// 执行业务逻辑
private void process() {
//....
int value = redis.value.increment(key)
if (value <= 3) {
doJob()
}
}
2、考察SQL能力
如下: 某大学教学场景数据设计
课程表: 数据量 2000行
CREATE TABLE `course` (
`course_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '课程id,实例 1001',
`course_name` varchar(20) NOT NULL COMMENT '课程名称 示例 机器学习课程',
PRIMARY KEY (`course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='课程表';
学生表: 数据量 30000行
CREATE TABLE `student` (
`student_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '学号 实例:202001001',
`student_name` varchar(20) NOT NULL COMMENT '姓名 示例:张三',
PRIMARY KEY (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生表 ';
课程分数表: 数据量 50万行
CREATE TABLE `score` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id 示例 1000',
`student_id` bigint(20) NOT NULL COMMENT '学号 示例:202001001',
term varchar(20) NOT NULL COMMENT '学期 示例:2020上学期',
`course_id` bigint(20) NOT NULL COMMENT '课程id 示例:1001',
`score` int(11) NOT NULL COMMENT '分数 示例:85',
`status` tinyint NOT NULL COMMENT '状态 1 表示有效, 0 表示无效',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分数表';
针对这几张表,我们有以下这几种场景查询和修改场景,看每个场景sql 如何写?以及最后给表添加合适的索引。
A、统计每个学生每个学期的总分、平均分、最高课程分数,最低课程分数,按照学期 倒序,平均分 倒序,取排序前20名。
展示字段名字: 学生学号,学生姓名,学期,总分,均分,最高课程分数,最低课程分数,
Select sc.term,sc.student_id,st.student_name,sc.term,sum(sc.score),avg(sc.score),
max(sc.score),min(sc.score) from score sc
left join student st on st.student_id=sc.student_id
Where sc.status=1
Group by sc.term,sc.student_id order by sc.term desc,avg(sc.score) desc limit 20
B、查询指定学期(term = '2020上学期')学期,每个课程的学生数、以及不及格(score < 60)学生的数量
展示字段名称: 学期(term),课程ID(course_id), 该课程学生数量, 该课程不及格学生数量
Select sc.term,sc.course_id,
count(student_id) as 学生数量,
SUM( IF(score < 60, 1, 0 ) ) as 不及格学生数量
from score sc where sc.term = '2020上学期' and status =1
group by sc.term,sc.course_id
- 对score表,更新指定学生(student_id = 202001001 )的 指定课程 (course_id = 1001 ) 全部更新为无效(status = 0) 。
Update score set status = 0 where student_id = 202001001,and course_id = 1001
D、基于以上场景,应该添加哪些索引?
Score.student_id Score.course_id ,Score.score
3、考察实战编码,在本地IDE编辑代码,最后贴这里
//登陆安全的题目,如果你的系统登陆接口在被刷。我们要上线个防刷限流功能。示例代码如下:根据登陆ip,1分钟之内,只能请求10次登陆请求,不超过10次返回ture,超过10次的返回false,支持并发场景。 只考虑单机场景限制,使用java 代码原生实现(不使用中间件redis 计数器之类的方案)
public class Solution {
//一定时间内的最多登录次数
private static int maxLoginTimes;
//时长
private static long thresholdInMillisecond;
private Map<String, LinkedList<Long>> map = new HashMap<>();
public boolean access(String ip) {
Integer count;
if (null == map.get(ip)) {
LinkedList<Long> list = new LinkedList<>();
list.push(System.currentTimeMillis());
map.put(ip, list);
return true;
} else {
LinkedList<Long> list = map.get(ip);
long time = System.currentTimeMillis();
Long successTime = time - list.get(0);
if (list.size() < maxLoginTimes && successTime < thresholdInMillisecond) {
list.push(System.currentTimeMillis());
return true;
} else {
return false;
}
}
}
public static void main(String[] args) throws Exception {
Solution solution = new Solution();
maxLoginTimes=10;
thresholdInMillisecond= 10000;
boolean flag = solution.access("192.168.1.1");
}
}