微信公众号:码农编程进阶笔记

问题或建议,请公众号留言!

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

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

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.乱序数组,构建二叉树(算法)

2021年最新大厂php+go面试题集(四)_分布式_02