昆仑天工—Go社招—一面技术(硬)- 过- 7.9
一面
- 面试官介绍公司的情况
- 自我介绍
- 项目经验考察
- 大概介绍下ark方舟中台系统
- 数据抓取是一个什么样的流程?
- 数据的量级
- 有没有数据清洗和报表的一个流程,去重怎么做的?单纯的同一时间去重还是有什么策略?
- 介绍一下游戏项目
- 数据库是怎么建的
- 有没有考虑过热key的问题,所有用户的购买和校验都要走这一个key,比如说他的更新和修改会非常的频繁,有没有考虑过?
- redis热key怎么优化?
- bitmap不适合高频修改
- 讲解一下支付的流程
- 技术深度和广度考察
- Golang
- GMP模型
- 协程间的通信一般有哪些办法?
- Goroutine 之间的通信 ,用channel 和 加锁 (sync.Mutex) 的方式有什么区别呢?
- 基于通信的共享内存 和 基于共享内存的通信,有什么本质上的区别?
- 闭包的参数传递如何避免内存逃逸的问题
- Golang的异常处理机制
- runtime error golang的 recover是接不住的, 哪些运行的时候错误,在panic的时候,recover 接不住
- redis
- zset的使用场景
- 分数相同的情况下,排序方式
- 希望同一个排行榜,先达到分数的人排在前面,后达到分数的人排在后面,跟时间有关系,跟成员没关系。怎么做
- 分数和时间戳怎么放呢?
- 分数 + 时间戳:将分数和时间戳组合成一个新的值作为排序的依据。这里,分数可以保持不变,而时间戳则用于在分数相同的情况下区分元素的顺序。由于时间戳是一个很大的整数,直接将其与分数相加可能会导致数值溢出或失去精度,因此我们需要将时间戳转换为一个可以与分数相加且不会溢出的小数值。
- 一种常见的做法是将时间戳除以一个足够大的数(比如1e13,即10的13次方,这取决于你希望保留的时间精度和分数范围),得到一个可以作为小数部分的值,然后将其与分数相加。例如,如果分数是整数,时间戳是毫秒级的时间戳,那么可以将时间戳除以1e13,得到一个大约0到1之间的小数,然后将其加到分数上。
- 支持range操作,保证范围查询;保证非常快捷方便的去获取分数,尽可能的不需要太多的对时间戳的转换;考虑更新ZINCRBY,这种场景的话如果传时间戳了,必然需要更新时间戳,因为时间戳是天然不支持ZINCRBY的;那么这种情况下如何保证高并发问题。如果要做更新而不是INCR的话那必然需要get操作,get操作的话需要加锁的。从这三个方面考虑这种怎么做,怎么放,怎么查。尽可能保证高并发情况下的稳定性。
- 签到任务,前面100个签到天数一样,只是签到时间不一样,这该怎么做?
- hashmap的一些使用场景,什么情况下用hashmap,什么情况下直接用string去存储一个序列化后的字符串
- mysql
- 假设现在有一个慢查询,从哪些方面去考虑说为什么会出现慢查询,然后怎么去优化呢?
- 假设有一张表有a,b,c三个字段,现在有3条sql,分别对a b,a 和 b c这三种情况去做一个查询,这种情况下怎么建索引比较合适
- 索引1 (a, b):
- 当查询只涉及a时,例如 SELECT * FROM my_table WHERE a = ?,可以使用索引的前缀部分a。
- 当查询涉及a和b时,例如 SELECT * FROM my_table WHERE a = ? AND b = ?,完整的索引 (a, b) 能够完全覆盖查询条件。
- 索引2 (b, c):
- 当查询涉及b和c时,例如 SELECT * FROM my_table WHERE b = ? AND c = ?,完整的索引 (b, c) 能够完全覆盖查询条件。
- 算法背包问题
- 假设有一个抽奖功能,假设现在有10个礼物价值1到10,需要随机的从中挑选一些礼物传给用户。首先抽奖的时候,随机一个礼物价值(假设也在1到10之间),假如抽到10,需要给用户返回10价值的礼物(可能是1个10礼物,或者3和7礼物,或者4和6礼物,或2+3+5的礼物)。礼物不能重复,两个变量:礼物的价值,礼物的数量(可能在1到3之间波动),这两个值都是随机生成的。写一个算法怎么确定给用户返回的礼物数量?并且尽可能的把10个礼物平均随机的发出去,而不是只发某一个价值高的礼物。怎么设计
- Golang
- 后面的几个场景题着实有些难度,描述太长了,听的都不是很懂,大脑一片空白
- 昆仑的技术实力着实不错,一家公司的好坏从redis的使用就能看出个大概,而昆仑就是重度使用redis,面试的重点问的也是redis的实际场景设计。期待能加入这样的公司
- 流程很快,面完当天就通知第二天线下二面了(又是线下,太折磨人了~~~~)
- 明天更新后续