虾皮后端开发面经(已offer)

时间点如下:6.17投递 -> 6.30一面 -> 7.15二面 -> 7.29 hr面 -> 8.5口头 -> 8.9 offer,整体来讲流程比较长,因为候选人很多,估计是备胎转正的。

一点思考

    shopee比较重视大厂经验,有大厂经验是比较重要的敲门砖了。另外,一面也会出算法题,但是比较常见,********多刷刷常见题就行。语言不是很重要,因为shopee主要用的是go,所以java八股文问的不是很多,主要还是问一些操作系统、数据库、网络基础。另外,社招的话,比较讲究系统设计和架构经验,平时多多思考即可应付。

    今年找工作十分不易,市场候选人很多,希望这篇面经能帮到大家~

shopee一面(6.30 11:00)

    一面面试官感觉比较年轻,问的都是基础,包括操作系统、数据库、网络等,算法题不难,********上常见题。

  1. cpu load比较高,怎么排查?

  2. jstack是怎么实现的

  3. io多路复用如何实现?select和epoll有什么区别?

  4. volatile有什么用,内存屏障怎么实现的。

内存屏障本质上是一系列cpu指令。内存屏障是硬件层的概念。语义上,内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。因此,对于敏感的程序块,写操作之后、读操作之前可以插入内存屏障。
https://zhuanlan.zhihu.com/p/125737864
https://zh.wikipedia.org/zh-cn/%E5%86%85%E5%AD%98%E5%B1%8F%E9%9A%9C
https://www.jianshu.com/p/2ab5e3d7e510

  1. 给定一个n,输出所有可能合法的n个括号对,构成的字符串

    ******************************************************

  2. zero copy怎么实现的?

写数据到磁盘时,调用mmap,内存映射到磁盘;读数据时,sendFile,从磁盘直接读取到网卡缓存。

  1. 流程回滚(异常处理)机制怎么实现的?

    节点粒度级别,多个组件进行回滚。

  2. tcp粘包是什么原因,如何解决?

  3. 如何实现无锁的递增计数器,用CAS,CAS有什么问题,竞争激烈了(线程比较多,并发比较大),怎么解决?

    锁升级。

  4. 有一个很大的文件,如何快速找到前n个出现次数最多的单词

  5. 给你a/b/c三个字段,一般怎么建立索引,索引(a,b,c),是否可以使用c作为索引,mysql innodb是否可以用b树

  1. 慢查询怎么发现,怎么排查,怎么优化

  2. kafka批量消费,如果消费过长,会导致消费超时,触发rebalance吧?

    调大session timeout,而且消费逻辑很快的,sessionTimeou和pollTimeout有什么区别,哪个会出发rebalance,如何设置?

shopee二面(7.15 14:00)

    二面是个leader,设计题比较多,感觉是比较重视根据已有经验进行设计。

  1. LRU cache怎么实现?get()/put()复杂度如何?如何实现过期?如何避免过期遍历所有?

过期数据使用小根堆?或者时间轮
看下时间轮如何取消任务的?是立即取消还是延期取消??
guava cache是如何实现过期的?

  1. RTC如何实现的?如何实现调度的?

  2. 有一批帖子,会根据类别搜索,但是现在是单独一个表,现在查询非常慢,如何提高搜索性能?

    根据类别分库分表,库可以放到不同的实例上,经常查询的不变的数据可以放到缓存里。
    数据有更新时,需要刷新下缓存
    因为分表后,只能是固定类别,所以需要根据类别去分开查找。
    如果还有另一个重要的字段也需要查,可以再建一个分表,user-ses/ses-user就是这么做的,但是冗余就比较大了。。。

  1. 如果有多个表,进行聚合查询,如何解决深分页的问题,

    就是保存每个节点的表id给前端,前端查询时把id返回过来了,然后加到SQL里,但是不一定准。这里回答的是单个表吧。。

  2. 分表的数据,动态增加一张表,不停服如何实现?

    分区策略使用一致性哈希
    然后新表的数据,查询的时候,先查老的,再插入新的。如果老数据没有动,需要有对应的迁移服务进行定时迁移。插入的时候优先插入到新的表。

  3. 迁移线程和用户线程同时执行,会有数据库不一致的问题,怎么解决?

    加分布式锁

  4. 分布式锁如何实现?redission怎么实现的?lua脚本

  5. 如果有多个字段进行查询呢?任意维度检索。

    使用ES构建索引。基于binlog进行构建索引。

  6. 如何保证数据库和ES数据的一致性

    定期查询数据库,校准ES。一种是写入重试。

  7. 数据库为什么用B+树?而不用哈希

    利用磁盘的特性,方便范围查询多条数据,一般一个节点是一个磁盘块的倍数,例如mysql innodb是16KB
    https://mp.weixin.qq.com/s/FAZanRX22g4OB1S4d_ZCzQ

  8. 那把相邻的磁盘块放到一起就可以了?

    还需要分层次,保证查找是log(n),快速定位到头和尾,而不是遍历所有磁盘块。

  9. NEWSQL,例如tidb、leveldb、hbase使用LSM树,有了解过为什么吗?

http://www.codebaoku.com/eth/eth-lsm.html
https://zhuanlan.zhihu.com/p/53299778
日志策略(顺序读写,只追加不修改),写性能会好很多。

LSM写操作(插入、更新、删除,直接在c0树进行操作,非常块),读操作,从内存开始读,最差可能要读到ck树(磁盘上)

当数据访问以写操作为主,而读操作则集中在最近写入的数据上时,使用LSM树可以极大程度地减少磁盘的访问次数,加快访问速度。

数据首先会插入内存中的树。当内存树的数据量超过设定阈值后,会进行合并操作。合并操作会从左至右便利内存中树的子节点 与 磁盘中树的子节点并进行合并,会用最新更新的数据覆盖旧的数据(或者记录为不同版本)。当被合并合并数据量达到磁盘的存储页大小时。会将合并后的数据持久化到磁盘,同时更新父节点对子节点的指针。

数据分片的方案非常多,可以像 Codis 那样通过转发代理来分片,也可以像 Redis-Cluster 那样使用客户端转发机制来分片,还可以使用 TiDB 的 Raft 分布式一致性算法来分组管理分片。最简单最易于理解的还是要数 Codis 的转发代理分片。

  1. 两个机房,某个机房可能断电,如何做多机房容灾。

    负载均衡层,支持切换机房
    写数据的时候,中间件(db/redis/es)都要进行双写。
    kafka容灾,mirror maker: https://cloud.tencent.com/developer/article/1358933

  1. 主从机房同步有什么问题呢?

    会有比较大的延迟。
    一些分布式的问题,例如分布式事务,可能就执行了几步,然后就挂了,需要有一定的策略,进行回滚或者提交。
    切换机房的过程中,可能存在数据丢失,重复数据等

  • 双向同步,两个机房都能写入,如果操作的是各自的数据的话,问题不大。如果操作的是相同数据,必然会有冲突,需要解决。所以上层保证相同数据到同一个机房即可,然后同步到另外一个机房,保证每个机房都有全量的数据。各种中间件都要做改造。

  • 总之,分片的核心思路在于,让同一个用户的相关请求,只在一个机房内完成所有业务「闭环」,不再出现「跨机房」访问。

  • 阿里在实施这种方案时,给它起了个名字,叫做「单元化」。

  • 这里还有一种情况,是无法做数据分片的:全局数据。例如系统配置、商品库存这类需要强一致的数据,这类服务依旧只能采用写主机房,读从机房的方案,不做双活。

  • 双活的重点,是要优先保证「核心」业务先实现双活,并不是「全部」业务实现双活。

https://mp.weixin.qq.com/s/hWCmnsa3rdtMFTE_BSyg2w

  1. 冷机房新请求过来,发现缓存没有,会把数据库打挂,这个怎么解决?

    预热,提前加载到缓存。
    或者平时保持一定的流量。
    用了缓存的,一般需要预热下,防止雪崩。

  2. 定时任务这种,怎么改变执行的机房。

    加开关,任何时候都有一个条件不满足,在空跑。

shopee hr面(7.29 11:00)

    问的离职原因,选择shopee的原因,以及讲下做的比较好的项目,估计也是看看口头沟通能力吧。之后加了微信,给了薪资流水,但是过了一周才给我口头offer,确实是候选人太多了,我一直催着才给的。薪资给的也不高,压的非常狠。

#面经##字节跳动##虾皮##校招##社招#
全部评论
…还以为是校招。吓cry😓😓
23 回复 分享
发布于 2022-08-20 12:14 湖南
原来是清华社招,难怪好多我根本无从下嘴
9 回复 分享
发布于 2022-08-21 10:16 浙江
吓死了看了楼上才松了口气😱
6 回复 分享
发布于 2022-08-20 13:23 江苏
我说怎么这么强,原来是清华+社招
4 回复 分享
发布于 2022-08-20 23:59 江苏
有一个很大的文件,如何快速找到前n个出现次数最多的单词  大佬可以介绍一下你的思路吗,想学习一下。
2 回复 分享
发布于 2022-08-22 16:20 重庆
看了下来,会的屈指可数,膜拜大佬
1 回复 分享
发布于 2022-09-09 00:13 上海
1 回复 分享
发布于 2022-08-20 14:07 广东
楼主现在还好吗
点赞 回复 分享
发布于 2022-09-22 10:21 贵州
看看我
点赞 回复 分享
发布于 2022-09-06 12:31 上海
给多少k
点赞 回复 分享
发布于 2022-08-26 09:47 江苏
哈人。😱
点赞 回复 分享
发布于 2022-08-23 23:12 四川
离谱,看到这些问题,吓死了
点赞 回复 分享
发布于 2022-08-21 20:16 广东
多少年经验啊
点赞 回复 分享
发布于 2022-08-21 15:55 上海

相关推荐

2025-12-21 12:15
门头沟学院 Java
1、常见的方案有数据库自增ID、UUID、Redis生成和雪花算法。实际分布式场景下,雪花算法更常用,它将ID分为时间戳、机器ID和序列号三部分,性能高且趋势递增。但要注意时钟回拨问题,可通过记录上次生成时间戳或使用扩展版算法解决。2、雪花算法的ID在时间戳维度是递增的,但同一毫秒多机器生成的ID可能乱序。如需严格单调递增,可用数据库号段模式:服务启动时申请一个ID范围,内存分配用完后再次申请,这样单服务内ID严格递增。3、redo log是InnoDB的物理日志,崩溃恢复时重放提交的事务;undo log记录数据修改前的状态,用于回滚和MVCC读;binlog是MySQL Server层的逻辑日志,用于主从同步和数据备份。4、主库将变更写入binlog,从库通过IO线程拉取binlog到relay log,再由SQL线程重放SQL实现同步。5、优化索引时要减少回表和利用覆盖索引。索引失效常见于:违反最左前缀、对索引列计算、类型转换、LIKE左模糊匹配、OR连接非索引列等情况。6、InnoDB索引用B+树实现,联合索引按字段从左到右排序。如果跳过左侧字段,因为b的值在全局无序,无法利用索引快速定位,导致失效。7、当元素少且小时,用压缩列表节省内存;当元素多或大时,自动转为 "跳跃表+字典" 组合。跳跃表负责按分值排序,支持高效范围查询;字典负责成员到分值的映射,实现O(1)快速查分数。这种设计平衡了内存与性能。8、跳表插入节点时,从最高层向右向下逐层搜索并记录小于目标的分值位置(update[]);随后随机生成新节点层高,创建节点并按层将其插入:每层链接到对应update[]节点之后,并指向其原后继;最后更新跳表的最大层高和节点总数,实现高效定位与平衡插入。9、Redis有6种淘汰策略,常用的是allkeys-lru和allkeys-lfu。LRU淘汰最近最少访问的,LFU淘汰访问频率最低的。LFU更适合长期热点场景,而LRU对突发流量更敏感。10、Redis用惰性删除+定期删除组合:访问key时检查过期,同时后台定期抽样清理过期key。当内存不足时,再根据淘汰策略主动删除数据。11、TCP通过滑动窗口实现流量控制:接收方在ACK包中携带窗口大小。发送方根据这个窗口动态调整发送数据量,避免接收方缓冲区溢出。
点赞 评论 收藏
分享
2025-12-20 14:15
门头沟学院 Java
项目 1.讲一下用户登录机制2.登录之后会有一个状态的记录,并不是每次都要去用户登录,但是我又要拿到一个用户登录的信息去查询它自己的一些内容,这块是怎么做的?3.前端是怎么将token发给你的?因为它其实是一个http请求,然后你拿到的是一个http请求,你要去解这个token的参数,从哪儿获取这个参数去解?前端要一直存着这个token值,它要存在哪里?4.token存在redis里,要存储多长时间?5.这套系统里mysql有多少张表?里面都存了什么数据?6.商户表里是怎么存的?7.kafka在项目中的具体使用场景是什么?8.kafka相对于rabbitmq的优势是什么?你为什么选择了kafka?9.kafka的零拷贝是怎么实现的?(不是过程是什么样,实际上它是调用了一个函数,是怎么样的)10.为什么要用redis去做“共同关注”这个东西?因为redis是作为一个缓存存在的,稳定性没有那么高它是内存级别的,存储价格很高。为什么一个长期的东西要用redis去存储?11.不会/nginx具体你是怎么做的?使用nginx的时候都做了什么样的配置呢?(nginx是开源的,然后11.你只是拉下来一个bean文件就能执行,但其实你能干预的点是有限的,你都对它做了一些什么配置?)八股1.JVM的内存结构2.JVM的垃圾回收机制3.mysql中事务的特性4.这四大特性具体是为了避免什么问题出现5.什么是覆盖索引?他能解决哪方面的问题?6.mysql库里面的主从同步是怎么实现的?
点赞 评论 收藏
分享
评论
33
249
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务