记录

242 阅读14分钟

ant 2

1、秒杀场景题

两个主要难题:高并发、超卖、恶意请求

高并发问题

使用redis缓存,一台不够的话就用redis集群,同时用哨兵模式保证高可用,读写分离

nigix负载均衡,加机器

前后端限流

前端限流:这个很简单,一般秒杀不会让你一直点的,一般都是点击一下或者两下然后几秒之后才可以继续点击,这也是保护服务器的一种手段。
后端限流:秒杀的时候肯定是涉及到后续的订单生成和支付等操作,但是都只是成功的幸运儿才会走到那一步,那一旦100个产品卖光了,return了一个false,前端直接秒杀结束,然后你后端也关闭后续无效请求的介入了。

库存预热:

开始秒杀前通过定时任务或者运维同学提前把商品的库存加载到Redis中去,让整个流程都在Redis里面去做,然后等秒杀结束了,再异步的去修改库存就好了。

超卖问题

使用redis的lua脚本保证原子性,将查询库存减库存的操作写在Lua脚本中。
Lua脚本是类似Redis事务,有一定的原子性,不会被其他命令插队,可以完成一些Redis事务性的操作。

image.png

2、聚簇索引和非聚簇索引的区别

对于聚簇索引表来说,表数据是和主键一起存储的,主键索引的叶结点存储行数据(包含了主键值),二级索引的叶结点存储行的主键值。使用的是B+树作为索引的存储结构,非叶子节点都是索引关键字,但非叶子节点中的关键字中不存储对应记录的具体内容或内容地址。叶子节点上的数据是主键与具体记录(数据内容)。

聚簇索引的优点

1.当你需要取出一定范围内的数据时,用聚簇索引比用非聚簇索引好。
2.当通过聚簇索引查找目标数据时理论上比非聚簇索引要快,因为非聚簇索引定位到对应主键时还要多一次目标记录寻址,即多一次I/O。
3.使用覆盖索引扫描的查询可以直接使用页节点中的主键值。

非聚簇索引

索引的存储和数据的存储是分离的,也就是说找到了索引但没找到数据,需要根据索引上的值(主键)再次回表查询,非聚簇索引也叫做辅助索引。

3、Mysql索引都有哪些

一级索引,二级索引
覆盖索引,唯一索引

4、事务了解吗?

5、如何保证ACID特性

A,原子性,mysql通过undo log来实现原子性,如果操作失败需要回滚,那么使用undo log执行之前操作的反向操作。

C,一致性,

I,隔离性,通过加锁和mvcc的方式来实现,比如行锁,表锁,间隙锁,意向锁,读锁和写锁。 mvcc则通过快照读,read View的方式实现,每行数据有个事务ID和一个指向之前版本的指针。
read view根据隔离级别的不同生成的时间也不同,如果是可重复读级别,则在一个事务第一次读的时候生成一个read view,如果是读已提交,则在事务中每次读数据的时候都生成一个read view。

D,持久化,通过redo log实现,每个操作在写入bufferPool之前先写到redo log里,由于是顺序读写所以性能比较好,如果机器掉电的话可以从redo log里恢复。

6、kafka和rabbitMQ的对比

7、jre、jdk、jvm的关系

jdk>jre>jvm

8、kafka如何保证消息不会被重复消费

9、kafka究竟是推数据还是拉数据

poll模式,消费者提交offset主动拉取消息

10、重写和重载的区别

重载(Overload):是一个类中多态性的一种表现,指同一个类中不同的函数使用相同的函数名,但是函数的参数个数或类型不同。可以有不同的返回类型;可以有不同的访问修饰符;可以抛出不同的异常。调用的时候根据函数的参数来区别不同的函数。

重写(Override): 是父类与子类之间的多态性,是子类对父类函数的重新实现。函数名和参数与父类一样,子类与父类函数体内容不一样。子类返回的类型必须与父类保持一致;子类方法访问修饰符的限制一定要大于父类方法的访问修饰(public>protected>default>private);子类重写方法一定不能抛出新的检查异常或者比被父类方法申明更加宽泛的检查型异常。

11、explain各列的定义
id : 表示SQL执行的顺序的标识,SQL从大到小的执行
select_type:表示查询中每个select子句的类型
table:显示这一行的数据是关于哪张表的,有时不是真实的表名字
type:表示MySQL在表中找到所需行的方式,又称“访问类型”。常用的类型有: ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)
possible_keys:指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用
Key:key列显示MySQL实际决定使用的键(索引),如果没有选择索引,键是NULL。
key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)
ref:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
rows: 表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数,理论上行数越少,查询性能越好
Extra:该列包含MySQL解决查询的详细信息

ant 1

1、项目中是否遇到了高并发的场景,如何应对

2、数据库索引如何设置?相应的原则

3、数据库的事务是什么?介绍下

4、系统中用到了哪些设计模式?

5、如何设计一个系统?

6、java异常有哪些?分类介绍下

image.png

Java异常关键字

try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。
finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
throw – 用于抛出异常。
throws – 用在方法签名中,用于声明该方法可能抛出的异常。

7、什么样的代码是好代码

好的命名
清晰的结构
优雅的格式
性能好,效率高
安全稳定

8、系统如何做幂等?

tencent 1

1、java虚拟机,对象的生命周期,类的生命周期。

类的加载过程

加载-验证-准备-解析-初始化-使用-卸载

加载-连接-初始化-使用-卸载

image.png

Java 对象的创建过程

image.png

如何判断对象需要回收

image.png

2、垃圾回收相关知识

image.png

3、Mysql主从复制机制

4、索引介绍下,为什么用B+树?有什么优点?

5、mysql有什么锁?介绍下间隙锁

6、TCP和UDP的区别

7、三次握手,握手后如何发送数据,比如1个G的数据,如何发过去。

8、http有了解吗?

9、项目中如何保证系统高可用?

tencent 1 海外计费

1、项目中的系统何时给kafka确认消息,产生消息丢失怎么办?如果场景严格要求每条消息至少被消费一次,该如何保证?kafka新特性能保证,了解吗?

2、kafka如何保证生产者的消息不丢失?确认机制?

3、kafka快的原因。

1、首先是因为kafka采用了顺序读写的机制,通过追加的方式写磁盘,减少了磁盘寻道的开销。

2、其次是由于采用了零拷贝的技术,减少从内核缓冲区拷贝到用户缓冲区再拷贝到内核缓冲区的操作,同时减少了从用户态切换到内核态的上下文切换的开销。

3、消息批量操作,压缩。

4、公司的redis集群是怎样的?redis集群有多种方式,项目是用的哪种?客户端直接连单机redis和集群有什么区别吗?

1、主从模式

2、哨兵模式

3、cluster模式

5、redis zset底层的数据结构,简述跳表,时间复杂度是多少?

www.cnblogs.com/yuanfang090…

log n

6、调用下游接口和写数据库是在同一个事务中吗?分布式事务如何保证?

TCC

7、http和https有什么区别?http和tcp,udp有什么区别?tcp如何保证数据的可靠传输?

1、HTTP明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP)数据传输过程是加密的,安全性较好。
2、使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
3、HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
4、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
5、HTTPS其实就是建构在SSL/TLS 之上的HTTP协议,所以,要比较HTTPS比HTTP要更耗费服务器资源。

tcp如何保证数据的可靠传输
1: 校验和
2: 序列号
3: 确认应答
4: 超时重传
5: 连接管理
6: 流量控制
7: 拥塞控制

HTTPS工作原理

一、首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;
二、客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数使用公钥进行加密(RSA加密);
三、消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;
四、发送给服务端,此时只有服务端(RSA私钥)能解密。
五、解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。

http处于应用层,TCP和UDP处于传输层。

1、基于TCP的可靠通信
2、基于客户端与服务端的通信
3、无状态:是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
4、无连接:其含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

tcp跟udp区别

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的。UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小。
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。
7、速度:UDP要比TCP要快!

8、java并发相关的数据结构和锁简述一下

hashTable, ConcurrentHashMap

9、spring MVC中的controller每个请求进来都会有一个线程吗?

单例模式,但是每个请求都会有一个线程。用threadLocal保证线程安全

10、线程池的作用

1、降低资源消耗:通过重复利用现有的线程来执行任务,避免多次创建和销毁线程。
2、提高响应速度:因为省去了创建线程这个步骤,所以在拿到任务时,可以立刻开始执行。
3、提供附加功能:线程池的可拓展性使得我们可以自己加入新的功能,比如说定时、延时来执行某些线程。

常用的有两大类:
ThreadPoolExecutor
ScheduledThreadPoolExecutor

1、newCachedThreadPool
2、newFixedThreadPool
3、newSingleThreadExecutor
4、newScheduleThreadPool
5、newSingleThreadScheduledExecutor

11、Java里的锁有哪些?

乐观锁、悲观锁
独享锁、共享锁
公平锁、非公平锁
互斥锁、读写锁
可重入锁
分段锁
锁升级(无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁) JDK1.6

www.cnblogs.com/jyroy/p/113…

偏向锁通过对比Mark Word解决加锁问题,避免执行CAS操作。而轻量级锁是通过用CAS操作和自旋来解决加锁问题,避免线程阻塞和唤醒而影响性能。重量级锁是将除了拥有锁的线程以外的线程都阻塞。

12、并发的集合结构有哪些?介绍下concurrentHashMap

java1.7 segment数组+HashEntry数组+链表 ReentrantLock

java1.8 Node数组+链表+红黑树的数据结构来实现,并发控制使用Synchronized和CAS来操作

13、MySQL建立索引的原则,索引底层实现是什么?为什么要用B+树?

1、表的主键、外键必须有索引

2、为常作为查询条件的字段建立索引

3、索引应该创建在选择性高的字段上

4、经常与其他表进行连接的表,在连接的字段上应该创建索引

5、为经常需要排序、分组和联合操作的字段建立索引

B+树优点

1、单一节点存储的元素更多,使得查询的IO次数更少,所以也就使得它更适合做为数据库MySQL的底层数据结构了。
2、所有的查询都要查找到叶子节点,查询性能是稳定的,而B树,每个节点都可以查找到数据,所以不稳定。
3、所有的叶子节点形成了一个有序链表,更加便于查找。

14、一级索引和二级索引的区别?

一级索引
索引和数据存储在一起,都存储在同一个B+tree中的叶子节点。一般主键索引都是一级索引。

二级索引
二级索引树的叶子节点存储的是主键而不是数据。也就是说,在找到索引后,得到对应的主键,再回到一级索引中找主键对应的数据记录。

15、数据库如何保证ACID?undo Log何时清理?

15、dubbo和zooKeeper的关系?zooKeeper的功能。

dubbo采用zooKeeper作为注册中心,管理生产者和消费者节点。 生产者向zooKeeper注册自己的服务,消费者订阅服务进行消费。