腾讯云数据库研发部一面(50min)
-
API开放平台解决什么问题,有什么功能,你负责什么内容?
介绍过于冗长,应该突出重点,平台目前提供了什么服务,有什么功能?
-
你选择某一个功能点重点介绍下你负责的工作?
这里挑了比较拿得出手的API签名认证
应该把面试主动权掌握在自己手里,开始自己掌握节奏,可是太过紧张,并没发挥好
-
如果请求被抓包,发起重放,你如何解决?
回答:设置时间戳,如果30秒重复发送,对重复发送的请求拒绝,且如果某一IP连续发送若干次,我们将对该ip加入黑名单。
-
SK保密的前提成立,算法层面能否保证它不会被重放?
没回答好。
前端发送请求时,是不会讲SK(密钥)公开传递给服务器的,而是通过 请求方法+请求参数+当前时间戳+密钥 ==> 签名生成算法(MD5、SHA1) ==> 不可解密值
第三方抓包,只会抓到:签名。然后如果再发送给服务器的话,时间戳是不一样的。服务器会按照和客户端一样的方式生成 签名,由于两者时间戳不一样,所以生成的签名不一样。因此是不会发生重放的。
-
数据库存什么东西?
用户表、接口表。
用户表存用户信息:id、用户名、密码、AK、SK、权限类型...
接口表:id、接口名、用户id、用户总调用次数、用户最多能调用次数
接口调用表:id、用户id、接口id、创建时间
没答好...
-
那我们抽象一下,两个表table1(id, name) table2(id, date)(两个id都表示用户id)。统计每个用户调用接口的次数
select table1.name, count(table2.date) from table1.id = table2.id
-
假设用户没有调用也需要统计呢?
select table1.name, count(table2.date) from table1 left join table2 on tabe1.id = table2.id from 表1 left join 表2 on 条件
-
假设这种场景怎么建索引比较好?为什么?
id 建索引。
-
哪个表的id更关键?
-
MySQL 的索引?各个索引有啥区别?
针对不同场景,哪个字段调用次数频繁,就对某个字段设置索引。
这里没想到,就直接往数据结构B+树开始扯了。。。
-
你项目中提到的访问控制,流量染色是什么功能?
访问控制:黑白名单
流量染色:不用用户权限(如管理员、普通用户)
-
API开放平台几个人开发,怎么协作?
-
客户端和服务端用什么协议通信?
-
HTTP协议 如果需要 post 一个数据,它传输的内容是什么?
即:HTTP 请求报文、响应报文字段
-
后台开发经常设计临界资源的访问,如何解决?
只聊到用synchronized加锁
补充:在本项目中对于每个用户请求调用接口后,会统计每个接口调用次数。对于这个操作,其实就可能发生多线程并发问题,可能存在多个用户同时访问。 怎么解决:互斥锁(synchronized、ReentrantLock)、信号量(java.util.concurrent.Semaphore)、原子操作(AtomicInteger、AtomicLong)
-
平常开发在windows还是Linux开发,你这么项目跑在哪个操作系统?服务器怎么查看进程是否在运行? ps | grep java (grep 支持模糊查询)
-
如何查看你使用的端口是否监听 netstat -tuln | grep 端口号
-
了解过脚本嘛,使用过shell脚本嘛?
-
那我们聊聊第二个项目吧?简单介绍下你负责的功能实现?
-
你介绍了用户登录功能,有涉及到安全相关的问题嘛?怎么设计实现的?
果然不关心其他模块的实现。
这里答的不是很好。
补充:
● 用户登录时,会将 密码 和 当前时间戳 生成一个数字签名,然后传递给后端。
● 后端 收到用户的 用户名 和 签名后,先获取对应用户的数据库密码,然后 按照和前端一样的方式生成签名,判断两个签名是否一致
自己补充问题:
那你的token的功能是什么呢?以及自定义拦截器?
token主要用于:用户登录成功之后,我们会生成一个token,以及设置它的过期时间。在这段时间内,用户就一直处于登录状态。用户在这段时间内发送请求,就会被拦截器拦截,判断token是否过期,如果过期就需要重新登录。
token、sessin、cookie的区别?
token:JWT,身份验证和授权的令牌,由服务器生成发送给客户端,由客户端存储。客户端每次请求时,都会将token放到请求头或者请求参数中发送给服务器。
session:服务器存储的状态信息。当用户和服务器建立连接后,服务器会为每个用户创建唯一的会话,并分配唯一的id。session id 通常存储到cookie中。用户每次请求时,通过cookie发送给服务器。服务器根据session id查找对应的会话状态,并维护用户的状态。(用户打开一个网页,就是一个会话,关闭就结束会话)
cookie:客户端存储的小型文本文件。包含一些状态信息:如用户登录状态、浏览历史、偏好设置等。每次客户端向服务器发送请求时,浏览器会自动将于当前域相关的cookie附加到请求头发送给服务器。服务器通过请求头的cookie识别用户,获取相应的状态信息,从而实现个性化服务。
-
物联网设备采集信息很多,怎么保证数据不丢?
这里我们使用的传输层协议是TCP协议,TCP的机制保证了数据不会丢失。
没答好
-
智力题:假设有100个物品,两个人一起拿,每个人每次只能拿1-5个,你先手,怎么保证你拿到最后一个?
递归。保证自己能拿到96个,然后再依次判断能拿到90个。。。
-
手撕:数字消消乐。数字字符串,相邻数字相加为10就可以消掉,问最后剩余的字符串是什么?
栈的简单应用
-
线程安全问题?
-
手撕:生产者和消费者模型 public class ConsumerProducerTest { public static void main(String[] args) { Clerk clerk = new Clerk(); Producer p1 = new Producer(clerk);
Consumer c1 = new Consumer(clerk); Consumer c2 = new Consumer(clerk); p1.setName("生产者1"); c1.setName("消费者1"); c2.setName("消费者2"); p1.start(); c1.start(); c2.start();} }
//生产者 class Producer extends Thread{ private Clerk clerk;
public Producer(Clerk clerk){
this.clerk = clerk;
}
@Override
public void run() {
System.out.println("=========生产者开始生产产品========");
while(true){
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
//要求clerk去增加产品
clerk.addProduct();
}
}
}
//消费者 class Consumer extends Thread{ private Clerk clerk;
public Consumer(Clerk clerk){
this.clerk = clerk;
}
@Override
public void run() {
System.out.println("=========消费者开始消费产品========");
while(true){
try {
Thread.sleep(90);
} catch (InterruptedException e) {
e.printStackTrace();
}
//要求clerk去减少产品
clerk.minusProduct();
}
}
}
//资源类 class Clerk { private int productNum = 0;//产品数量 private static final int MAX_PRODUCT = 20; private static final int MIN_PRODUCT = 1;
//增加产品
public synchronized void addProduct() {
if(productNum < MAX_PRODUCT){
productNum++;
System.out.println(Thread.currentThread().getName() +
"生产了第" + productNum + "个产品");
//唤醒消费者
this.notifyAll();
}else{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//减少产品
public synchronized void minusProduct() {
if(productNum >= MIN_PRODUCT){
System.out.println(Thread.currentThread().getName() +
"消费了第" + productNum + "个产品");
productNum--;
//唤醒生产者
this.notifyAll();
}else{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
总结:
- 自我介绍过于平铺直述
- sql 答的一坨屎
- 太多的重复性确认问题
