zoukankan      html  css  js  c++  java
  • 2021年最新大厂php+go面试题集(四)

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

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

    22.回响科技一面

    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.全民快乐一面

    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.货拉拉二面

    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部门三面

    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.好未来一面

    1.服务间通信的实现
         微服务必须使用进程间通信机制来交互,微服务架构
         异步消息机制和同步请求/响应机制这两类 IPC 机制可用
    
     2.服务探针的实现
         存活探针:为了查看容器是否正在运行,如果返回false则重启pod
         就绪探针:查看容器是否准备好接受HTTP请求,通过则把流量发到pod上 
         存活探针和就绪探针被称作健康检查。
    
        微信公众号:码农编程进阶笔记
        关注可获得更多的视频教程及面试技巧。
     3.进程,线程间的通信方式
         进程--------
         1)管道( pipe ):一般是父子进程通信
         2)信号量:主要作为进程间以及同一进程内不同线程之间的同步手段
             也是一种锁机制
         3)共享内存:最快的ipc通信
         4)套接字:可用于不同的进程通信。
         5)消息队列:由消息的链表,存放在内核中并由消息队列标识符标识
         线程----------------
         线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于
         数据交换的通信机制。
         1)锁机制:包括互斥锁、条件变量、读写锁
         2)信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
         3)信号机制(Signal):类似进程间的信号处理

    27.映客一面

    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.小猪民宿

    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)

    8a655e6bf70f3e7c5f1360e70d3a74e7.png

    29.滴滴二面

    1.一致性hash
        (1)对2的32次方取模,构造0-2的32次方哈希环
        (2)对服务器的IP或主机名作为关键字进行哈希
        (3)计算key的hash,计算出在哪个空间,顺时针往下寻找节点即可
        (4)为了防止数据分布不均匀,构造虚拟节点
        (5)节点宕机,只会影响不一部分数据,其他节点还能正常使用
    
    2.两个文件a和b里面都是id,求出不同的id  
        (1)分治,hash(id)%1000,分成1000个小文件,a0...a99
        (2)此时a99中的id肯定也在b99中,文件就转化为了对小文件的求去重
         (3) 读取a0,构造hash表,再便遍历b0,如果a0中不存在则为不重复
         的id,放入新集合中即可
    
    4.myisam的应用场景
        特点:高性能读取,存储的有行数,无事务
        场景:(1)需要频繁count的场景
            (2)读多写少的场景

    30.百度1-5面

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

    往期精选

    4fe7c6c80064bde201bf6c19727ac0ff.gif

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

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

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

    【面试】50道经典计算机网络面试题

    dcc19a7879ce405a8d173767567a8dc0.png

  • 相关阅读:
    Rsync实现文件同步的算法(转载)
    Python模拟登录cnblogs
    负载均衡中四层和七层的介绍(转帖)
    Lvs+Keepalived实现MySQL高可用
    MySQL配置主主及主从备份
    Vim扩展YouCompleteMe插件
    使用Git
    Django回忆录
    Ansible安装配置及使用
    Hive学习之四 《Hive分区表场景案例应用案例,企业日志加载》 详解
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15452451.html
Copyright © 2011-2022 走看看