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)
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.乱序数组,构建二叉树(算法)
往期精选
赞赏码
非学,无以致疑;非问,无以广识