面试试答0621
tcp 三次握手和四次挥手的过程
拥塞控制的算法有哪几种
https://zhuanlan.zhihu.com/p/59656144
快速排序的平均时间复杂度和最差时间复杂度
my: 平均时间复杂度是 O(nlogn); 最差时间复杂度是 O(n^2),出现在恰好全部排反的情况,可以使用随机选取分割点的方式来尽量避免极端情况的出现。
answer: 时空复杂度
无序数组,求topk
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
if (k == 0 || arr.length == 0) {
return new int[0];
}
// ⚠️注意最后一个参数传入我们要找的下标(第k小的数下标是k-1)
return quickSearch(arr, 0, arr.length - 1, k - 1);
}
private int[] quickSearch(int[] nums, int lo, int hi, int k) {
// 每快排切分1次,找到排序后下标为j的元素,如果j恰好等于k就返回j以及j左边所有的数;
int j = partition(nums, lo, hi);
if (j == k) {
return Arrays.copyOf(nums, j + 1);
}
// 否则根据下标j与k的大小关系来决定继续切分左段还是右段。
return j > k ? quickSearch(nums, lo, j - 1, k)
: quickSearch(nums, j + 1, hi, k);
}
// 快排切分,返回下标j,使得比nums[j]小的数都在j的左边,比nums[j]大的数都在j的右边。
private int partition(int[] nums, int lo, int hi) {
int v = nums[lo];
int i = lo, j = hi + 1;
while (true) {
while (++i <= hi && nums[i] < v);
while (--j >= lo && nums[j] > v);
if (i >= j) {
break;
}
int t = nums[j];
nums[j] = nums[i];
nums[i] = t;
}
nums[lo] = nums[j];
nums[j] = v;
return j;
}
}
分库分表以什么维度来划分,会不会出现数据分配不均衡的情况
- 分布不均衡:时间,用户id
- 分布均衡:hash
java 的虚引用是做什么用的
my: 没有实际作用,只是一个标识,在垃圾回收的时候通知用。
answer:
数据库的主从复制是如何做的,如果突然挂掉了,怎么保证挂掉那段时间的数据
my: 主从复制主要有两种实现方式,一种是记录版本号,如果版本号不匹配,就进行更新;另一种方式是记录 ddl 语句。同步一般通过定时任务加消息流的方式。
如果主库挂了,那写操作会被切到从库上,待主库恢复后,需要从库将数据同步到主库。可以就此切换主从角色,也可以等同步完成后,主库再重新承担写职责。
answer: 主从复制
主从复制有三种形式:主从异步,主从同步,主从半同步
#反思 问到数据库问题时,先考虑是回答 Oracle 还是 MySql。
作为调用方和被调用方,分别如何避免缓存雪崩
跳表的思想是什么,什么时候用到跳表
my: 跳表使用了类似多级索引的概念,redis 的 zset 的两种实现,分别使用了跳表和压缩列表(ziplist)。
answer: 跳表
redis 过期键的删除策略
my: redis 采用的是惰性删除的策略。当 redis 键过期后,并不会直接删除,而是做一个删除标记。当请求到删除键时,redis会对这个键做删除操作。此外,redis 还会单独开一个线程,定期的清理过期的键。
answer: redis 过期策略。并不是做标记,不然对CPU的损耗就和直接删除一样了。是在接受到读请求后,比较时间,判断是否删除。
类加载机制,如果想自己控制类加载的机制要怎么做
https请求流程,如何获取最初的证书
如何实现一个限流功能,如果限流要做成分布式的,怎么做
my: 限流功能通常由令牌桶算法实现,当桶里没有令牌时,就拒绝请求。
answer: 服务端限流
java中的CAS是怎么实现的
answer:
import sum.misc.Unsafe;
public final int incrementAndGet() {
//无限循环直到成功
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next)) {
return next;
}
}
}
/**
* 相同返回true,不同返回false
**/
public final boolean compareAndSet(int expect, int update) {
return Unsafe.compareAndSwapInt(this, valueOffset
, expect, update);
}
假如要查 A in () and b in (),怎么建立索引
my: 我猜是建立 a 和 b 的复合索引
answer:
kafka的消费者如何做消息去重
布隆过滤器
answer: 布隆过滤器
kafka 的 consumerGroup 的概念
my: 消费者组里有多个消费者,共同消费一个topic。如果 topic 有多个 partition,一个 partition 只能被 cocumerGroup 中的一个 concumer 消费。
业务场景:文章的评论量非常大,比如一遍热门文章有几百万的评论,设计一个后端服务,实现评论的时序展示与分页
Arrays.asList() 生成的list,List.of() 生成的list,与 ArrayList 的区别
Arrays.asList()
List.of()
ArrayList