面试试答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请求流程,如何获取最初的证书

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