2021-01-14

笔试题

时间要求: 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

 

  1. 对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");

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值