2021年最新大厂php+go面试题集(四)

2021-09-29 15:54:42 浏览数 (1)

持续更新,每天进步一点点。。。

微信公众号:码农编程进阶笔记 关注可获得更多的视频教程及面试技巧。问题或建议,请公众号留言!

22.回响科技一面

代码语言:javascript复制
1.kafka多个分区怎么保证消息顺序
    (1)首先发送消息可以通过指定key 单分区实现
    (2)多个消费者消费的时候,可以自己对key取模,放入到队列中,
    开多线程去消费这些队列。队列内是有序的

2.mysql在没有隔离级别的情况下,多线程修改一行数据可以吗
    (1)隔离级别是为了解决事务的并发问题,比如脏读,不可重复读,幻读问题等
    (2)当没有隔离级别的时候,多线程修改一行数据,就会
    出现:原始数据是0.线程1想 1,线程2也想 1,那么同时执行,结果是2,
    但是对于线程1来说,我只是想 1而已

3.幂等性和线程安全?两个线程修改一个变量,为什么不行
    (1)确保在多线程访问的时候,我们的程序还能按照我们预期的行为去执行,
    那么就是线程安全。
    (2)两个线程修改一个变量是可以的,但结果可能不是我们想要的

4.redis为什么要有单线程,除了锁还有其他原因吗
    (1)锁开销
    (2)不存在多进程或者多线程导致的切换而消耗CPU
    (3)无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善,
    同时给redis实例绑定cpu核即可发挥多核的优势


5.rpc和http访问的区别在哪
    相同点:底层通讯都是基于socket,都可以实现远程调用,都可以实现服务调用服务
    不同点:
    (1)速度来看,RPC要比http更快,虽然底层都是TCP,但是http协议的信息往往比较臃肿
    (2难度来看,RPC实现较为复杂,http相对比较简单
    (3)如果对效率要求更高用rpc,灵活性通用性要求高用http
    (4)rpc是长连接,http是短连接,效率更高
    (5)rpc可以压缩消息,实现更极致的流量优化
6.mysql直接修改库存有什么问题?
    (1)没什么问题,主要是怕mysql承受不住太大的流量挂掉
    (2)常规方法是库存设置无符合,不能是负数,使用事务,
        代价是速度比较慢
    (3)我们可以考虑使用乐观锁,查询出version,修改的时候根据version来修改

7.go中的锁是怎么实现的
    互斥锁:通过状态status和信号量来实现的。
    协程1加锁的话,lock=1
    协程2加锁的话,waiter=1,代表等下
    锁释放:
        协程A主要是通过释放信号量来通知协程b,此时协程B可以加锁
    自旋:加锁失败会持续请求加锁,不会立刻阻塞。是通过cpu的空转实现的,30个时钟周期

8.  redis的rdb和aof过程大概说一下

23.全民快乐一面

代码语言:javascript复制
1.go常用的包有哪些,说说http和io包的函数
2.php的trait函数,trait引用的方法和原父类方法哪个优先级比较高
    父级使用trait关键字,当前类 通过use使用父类
    (1)代码复用,相当于copy了一份代码
    (2)类成员优先级为:当前类>Trait>父类

3.mysql主从不一致的原因,在配置一样,不考虑网络因素的情况下
    (1)主从两台机器的负载不一致,线程忙不过来
    (2)max_allowed_packet ,主库设置的大,当有大sql的话,从库无法执行
    (3)自增键不一致 ,自增步长不一致导致
    (4)同步参数未设置 
    =1   
4.go的channel怎么保证线程安全的
    (1)channel内部维护了一个互斥锁,来保证线程安全

5.100W用户刷视频,怎么保证用户刷的视频不不重复
6.php安装扩展的步骤,编译的命令是哪个
    1.  wget extension.tar.gz下载相应的扩展包并解压。
    2.  cd extension/切换到扩展extension的目录中
    3.  /php/bin/phpize 运行php安装目录下的phpize文件,
        这时候会在extension目录下生成相应的configure文件。
    4.  /configure --with-php-config=/php/bin/php-config 运行配置,
        如果你的服务器上只是装了一个版本的php则不需要添加--with-php-config 。后面的参数只是为了告诉phpize要建立基于哪个版本的扩展。
    5.  make && make install 编译模块

微信公众号:码农编程进阶笔记
关注可获得更多的视频教程及面试技巧。

7.唯一索引和主键索引的区别
    (1)一个表只能有一个主键索引,可以有多个唯一索引;
    (2)主键索引一定是唯一索引, 唯一索引不是主键索引;
    (3)主键可以与外键 构成 参照完整性约束, 防止数据不一致。

24.货拉拉二面

代码语言:javascript复制
1.kafka保证消息顺序性写入
    生产者发送消息的send有四个参数
    (分区号、时间戳、key、headers),我们可以指定key,
    来保证消息都发送到同一个分区
 2.php的while..true常驻进程会造成什么影响   

3.缓存击穿和缓存穿透
    (1)缓存击穿,是redis额热点key过期
        1)不给热点key设置过期时间
        2)互斥锁,发现无缓存,加锁去更新缓存
    (2)缓存穿透是redis mysql都顶不住了
        1)参数校验,防止不存在的key
        2)布隆过滤器
        3)缓存空值或者默认值

25.b站B部门三面

代码语言:javascript复制
1.接口网络超时如何排查  
    (1)代码层面
        1)下游sql等查询是否超时
        2)数据库连接是否满了,代码中是否出现死循环等
            占用大量的cpu和内存
   (2)网络层面
       1)运营商网络问题
2.kafka的offset和mysql的索引的区别
    kafka索引:
    (1)偏移量索引文件用来建立消息偏移量(offset)到物理地址之间的映射关系,
        方便快速定位消息所在的物理文件位置;
    (2)时间戳索引文件则根据指定的时间戳(timestamp)来查找对应的偏移量信息。
    查找步骤:
        (1)根据offset找到日志分段的索引文件(.index文件)
        (2)读取偏移量索引索引文件,使用二分找到最大索引项
        (3)读取日志分段文件并且从日志分段文件中顺序查找(.log文件)
        relativeOffset对应的消息
   区别:
       (1)kafka是系数索引,mysql是b 树索引
       (2)kafka维护索引使用了跳跃表结构,索引维护结构不会随便变动,有新索引
       文件才更新。mysql的索引树更新比较频繁
       (3)应用场景不同,kafka是主要是顺序写入,顺序读出,很少有检索的操作。


3.x=1 and y>1 order by z如何建索引    

26.好未来一面

代码语言:javascript复制
 1.服务间通信的实现
     微服务必须使用进程间通信机制来交互,微服务架构
     异步消息机制和同步请求/响应机制这两类 IPC 机制可用

 2.服务探针的实现
     存活探针:为了查看容器是否正在运行,如果返回false则重启pod
     就绪探针:查看容器是否准备好接受HTTP请求,通过则把流量发到pod上 
     存活探针和就绪探针被称作健康检查。

    微信公众号:码农编程进阶笔记
    关注可获得更多的视频教程及面试技巧。
 3.进程,线程间的通信方式
     进程--------
     1)管道( pipe ):一般是父子进程通信
     2)信号量:主要作为进程间以及同一进程内不同线程之间的同步手段
         也是一种锁机制
     3)共享内存:最快的ipc通信
     4)套接字:可用于不同的进程通信。
     5)消息队列:由消息的链表,存放在内核中并由消息队列标识符标识
     线程----------------
     线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于
     数据交换的通信机制。
     1)锁机制:包括互斥锁、条件变量、读写锁
     2)信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
     3)信号机制(Signal):类似进程间的信号处理

27.映客一面

代码语言:javascript复制
 1.手写lru
   2.mysql的acid分别是怎么实现的
   Atomicity)原子性: 事务是最小的执行单位,不允许分割。原子性确保动作
       要么全部完成,要么完全不起作用;
       (1)通过undo日志,事务回滚时能够撤销所有已经成功执行的sql语句

(Consistency)一致性: 执行事务前后,数据保持一致;
        (1)一致性是事务追求的最终目标,前问所诉的原子性、持久性和隔离性,
        其实都是为了保证数据库状态的一致性。

(Isolation)隔离性: 并发访问数据库时,一个事务不被其他事务所干扰。
        (1)四种隔离级别实现的
(Durability)持久性: 一个事务被提交之后。对数据库中数据的改变是持久的,
    即使数据库发生故障。
        (1)Innnodb有很多 log,持久性靠的是 redo log。
        (2)如果出现缓冲丢失,可以从redo logo日志中恢复



   3.go的syncmap怎么实现并发安全的
   (1)步骤
       a、过 read 和 dirty 两个字段将读写分离,读的数据存在只读字段 read 上,
           将最新写入的数据则存在 dirty 字段上
       b、读取时会先查询 read,不存在再查询 dirty,写入时则只写入 dirty
       c、读取 read 并不需要加锁,而读或写 dirty 都需要加锁
       d、另外有 misses 字段来统计 read 被穿透的次数(被穿透指需要读 dirty
            的情况),超过一定次数则将 dirty 数据同步到 read 上
       e、对于删除数据则直接通过标记来延迟删除
   (2)原理
    sync.map实现就是依靠两张map对读操作和写操作分离,后续根据需要在把
        dirty map合入 read map中。


   4.tcp的timewait怎么产生的,如何防范
       作用:
           (1)保证服务器能收到最后一次ack
           (2)同时2msl能保证旧报文消失,防止旧报文出现在新的连接中
      防范:
          (1)服务器设置套接字:so_reuseaddr
          (2)短连接改成长连接
          (3)linux内核参数:net.ipv4.tcp_tw_reuse


   5.介绍项目的时候,最好是把技术栈各方
   面都详细的说一下
   6.插入100W数据,大概耗时多少,如何优化?批量插入的时候会影响
   其他操作吗,如何优化?

   7.redis的分布式锁在高并发情况下会出现什么问题
       (1)锁续约问题,可以用redisson的看门狗机制
       (2)锁超时时间一定要设置
       (3)根据value上锁,防止释放锁混乱
       (4)分布式场景下,master加锁之后挂掉,slave会成为新的master
       此时A客户端认为自己上锁了,B客户端也能获取到锁,会造成锁混乱
       使用redlock会好一些
   8.https到底是对称加密还是非对称加密?
       答:是非对称加密(公私钥)  对称加密(传输内容对称加密)
       1.客户端请求服务端,获取公钥。
       2.服务端生成公私钥,自己保存私钥(SK),将公钥(PK)发给客户端。
       3.客户端生成随机字符串key,通过公钥(PK)加密后发送给服务端。
       4.服务端拿到加密后的内容后,用自己的私钥(SK)进行解密,得到key,
       后续的过程都是通过密钥(key)来进行对称加密来传输。

28.小猪民宿

代码语言:javascript复制
1.php的worker线程假死,如何重连的
    (1)首先,php-fpm假死一般是线程繁忙或者请求数过多,超时等原因,
    主要是修改配置文件,增加请求数量限制,超时时间等。
    (2)kill掉worker之后,master进程会自动创建一个work出来

2.设计php框架的问题
3. mysql的查询优化器工作原理
    (1)主要是判断cost,cost包括扫描行数等
    (2)参照mysql拾遗
4.单机多少配置才能顶住1000qps
    参考:https://blog.csdn.net/weixin_34346099/article/details/88679411
    假如机器是4核8G:
    (1)同时处理的请求做多4个    
    (2) 假设一个进程30M,那么4048/30 = 135(留一些给mysql)
    (3) 假设一个请求200ms,那么1000qps要求
    T = (1000 / n ) * t
    总耗时:T
    一次处理请求:n
    每次请求时间:t 200ms
    (4) 根据计算可以得知,我们一次要处理200个请求才行
        首先我们的worker进程是足够的,其次是4核也够用

    (5 )其他需要注意的点
        1)mysql连接数   
        2) 服务器句柄限制, ulimit -n查看
        3)tcp的timewait影响,允许端口复用
5.压测需要注意的参数
    1)qps
    2) 请求处理时间
    3)        

29.滴滴二面

代码语言:javascript复制
1.一致性hash
    (1)对2的32次方取模,构造0-2的32次方哈希环
    (2)对服务器的IP或主机名作为关键字进行哈希
    (3)计算key的hash,计算出在哪个空间,顺时针往下寻找节点即可
    (4)为了防止数据分布不均匀,构造虚拟节点
    (5)节点宕机,只会影响不一部分数据,其他节点还能正常使用

2.两个文件a和b里面都是id,求出不同的id  
    (1)分治,hash(id)00,分成1000个小文件,a0...a99
    (2)此时a99中的id肯定也在b99中,文件就转化为了对小文件的求去重
     (3) 读取a0,构造hash表,再便遍历b0,如果a0中不存在则为不重复
     的id,放入新集合中即可

4.myisam的应用场景
    特点:高性能读取,存储的有行数,无事务
    场景:(1)需要频繁count的场景
        (2)读多写少的场景

30.百度1-5面

代码语言:javascript复制
大部分八股文跟上面雷同,只记录不同的
1.对于团队管理的理解
2.项目的架构设计,为什么这么设计
3.字符串中,中括号,大括号,小括号, 判断是否匹配(算法)
4.乱序数组,构建二叉树(算法)

0 人点赞