腾讯云数据库研发部一面(50min)

  1. API开放平台解决什么问题,有什么功能,你负责什么内容?

    介绍过于冗长,应该突出重点,平台目前提供了什么服务,有什么功能?

  2. 你选择某一个功能点重点介绍下你负责的工作?

    这里挑了比较拿得出手的API签名认证

    应该把面试主动权掌握在自己手里,开始自己掌握节奏,可是太过紧张,并没发挥好

  3. 如果请求被抓包,发起重放,你如何解决?

    回答:设置时间戳,如果30秒重复发送,对重复发送的请求拒绝,且如果某一IP连续发送若干次,我们将对该ip加入黑名单。

  4. SK保密的前提成立,算法层面能否保证它不会被重放?

    没回答好。

    前端发送请求时,是不会讲SK(密钥)公开传递给服务器的,而是通过 请求方法+请求参数+当前时间戳+密钥 ==> 签名生成算法(MD5、SHA1) ==> 不可解密值

    第三方抓包,只会抓到:签名。然后如果再发送给服务器的话,时间戳是不一样的。服务器会按照和客户端一样的方式生成 签名,由于两者时间戳不一样,所以生成的签名不一样。因此是不会发生重放的。

  5. 数据库存什么东西?

    用户表、接口表。

    用户表存用户信息:id、用户名、密码、AK、SK、权限类型...

    接口表:id、接口名、用户id、用户总调用次数、用户最多能调用次数

    接口调用表:id、用户id、接口id、创建时间

    没答好...

  6. 那我们抽象一下,两个表table1(id, name) table2(id, date)(两个id都表示用户id)。统计每个用户调用接口的次数

select table1.name, count(table2.date) from table1.id = table2.id

  1. 假设用户没有调用也需要统计呢?

    select table1.name, count(table2.date) from table1 left join table2 on tabe1.id = table2.id from 表1 left join 表2 on 条件

  2. 假设这种场景怎么建索引比较好?为什么?

    id 建索引。

  3. 哪个表的id更关键?

  4. MySQL 的索引?各个索引有啥区别?

    针对不同场景,哪个字段调用次数频繁,就对某个字段设置索引。

    这里没想到,就直接往数据结构B+树开始扯了。。。

  5. 你项目中提到的访问控制,流量染色是什么功能?

    访问控制:黑白名单

    流量染色:不用用户权限(如管理员、普通用户)

  6. API开放平台几个人开发,怎么协作?

  7. 客户端和服务端用什么协议通信?

  8. HTTP协议 如果需要 post 一个数据,它传输的内容是什么?

    即:HTTP 请求报文、响应报文字段

  9. 后台开发经常设计临界资源的访问,如何解决?

    只聊到用synchronized加锁

    补充:在本项目中对于每个用户请求调用接口后,会统计每个接口调用次数。对于这个操作,其实就可能发生多线程并发问题,可能存在多个用户同时访问。 怎么解决:互斥锁(synchronized、ReentrantLock)、信号量(java.util.concurrent.Semaphore)、原子操作(AtomicInteger、AtomicLong)

  10. 平常开发在windows还是Linux开发,你这么项目跑在哪个操作系统?服务器怎么查看进程是否在运行? ps | grep java (grep 支持模糊查询)

  11. 如何查看你使用的端口是否监听 netstat -tuln | grep 端口号

  12. 了解过脚本嘛,使用过shell脚本嘛?

  13. 那我们聊聊第二个项目吧?简单介绍下你负责的功能实现?

  14. 你介绍了用户登录功能,有涉及到安全相关的问题嘛?怎么设计实现的?

    果然不关心其他模块的实现。

    这里答的不是很好。

    补充:

    ● 用户登录时,会将 密码 和 当前时间戳 生成一个数字签名,然后传递给后端。

    ● 后端 收到用户的 用户名 和 签名后,先获取对应用户的数据库密码,然后 按照和前端一样的方式生成签名,判断两个签名是否一致

    自己补充问题:

    那你的token的功能是什么呢?以及自定义拦截器?

    token主要用于:用户登录成功之后,我们会生成一个token,以及设置它的过期时间。在这段时间内,用户就一直处于登录状态。用户在这段时间内发送请求,就会被拦截器拦截,判断token是否过期,如果过期就需要重新登录。

    token、sessin、cookie的区别?

    token:JWT,身份验证和授权的令牌,由服务器生成发送给客户端,由客户端存储。客户端每次请求时,都会将token放到请求头或者请求参数中发送给服务器。

    session:服务器存储的状态信息。当用户和服务器建立连接后,服务器会为每个用户创建唯一的会话,并分配唯一的id。session id 通常存储到cookie中。用户每次请求时,通过cookie发送给服务器。服务器根据session id查找对应的会话状态,并维护用户的状态。(用户打开一个网页,就是一个会话,关闭就结束会话)

    cookie:客户端存储的小型文本文件。包含一些状态信息:如用户登录状态、浏览历史、偏好设置等。每次客户端向服务器发送请求时,浏览器会自动将于当前域相关的cookie附加到请求头发送给服务器。服务器通过请求头的cookie识别用户,获取相应的状态信息,从而实现个性化服务。

  15. 物联网设备采集信息很多,怎么保证数据不丢?

    这里我们使用的传输层协议是TCP协议,TCP的机制保证了数据不会丢失。

    没答好

  16. 智力题:假设有100个物品,两个人一起拿,每个人每次只能拿1-5个,你先手,怎么保证你拿到最后一个?

    递归。保证自己能拿到96个,然后再依次判断能拿到90个。。。

  17. 手撕:数字消消乐。数字字符串,相邻数字相加为10就可以消掉,问最后剩余的字符串是什么?

    栈的简单应用

  18. 线程安全问题?

  19. 手撕:生产者和消费者模型 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();
		}
	}
}

总结:

  1. 自我介绍过于平铺直述
  2. sql 答的一坨屎
  3. 太多的重复性确认问题
#腾讯云##面经#
全部评论
好详细哇
点赞 回复 分享
发布于 今天 14:06 湖北
这是啥时候的面试啦
点赞 回复 分享
发布于 今天 14:06 北京
感谢分享
点赞 回复 分享
发布于 今天 13:50 重庆
佬 求tl
点赞 回复 分享
发布于 今天 13:49 山东
佬你这是啥时候面的呀
点赞 回复 分享
发布于 今天 13:34 北京
太强了
点赞 回复 分享
发布于 今天 13:33 北京

相关推荐

评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务