后端Go富途一战、又是4到算法题、爱问 redis

1,159 阅读5分钟

招聘岗位内通

主要是做基础云服务搭建、包含鉴权、发票等公司通用业务

面试流程

整体面试感觉还可以,自己说的有点结结巴巴,没有网上说的那么桀骜不驯,自以为是,目中无人情况,但是有些问题自己确实没有准备特别好,像go语言、redis底层跳表等,无奈的是又是4道算法题,这次算法运气好,整体算是做出来3道,其中有一题是暴力破解

面试题真解

Redis 连环问

1、redis 常用数据结构?五种:string/hash/list/set/zset

2、用 redis 设计一个 ip查找地区?(提示我了ip可以转化为int) zset + zrangByScore(求分数值区间范围)

cityIP 通过 ip2long 转换
value: city
score: ip(小的ip端加特殊字符区分)

3、zset底层怎么实现?回答了跳表(zipList + skipList)

# zipList
故事:假设10w个1 5个10000000,用数组需要按最大去开辟,浪费空间
zipList:节点+长度(按需分配)
优势:节约内存
劣势:
     1、压缩表是紧凑的,新增元素动态调整我们内存,不适合大规模数据量
     2、节点会存储前一个节点大小,会导致连锁更新问题
     (前一个节点<254,长度用1个字节,>254,长度五个字节) 
     

# skipList
1、多层有序链表实现(链表也有层级关系,上下层比约是1:2)
2、查询时间复杂度O(logN)
3、支持我们范围查询(倒序、正序)
4、创建节点层数是随机生成

4、redis 失效,很多数据打到 DB?

    热点数据
    es
    后台续命(定时处理快过期key)
    setNx + 第一个生成缓存
    限流

5、了解的限流算法?两者区别?令牌生成规则?(因为上一问说了限流)

1、固定窗口(类似redis计数器)
   单位时间计数,超过就拒绝访问,可能存在并发超过场景
   
2、滑动窗口
   更小单位时间的计数,解决上面临界问题
   
3、漏桶算法
   // 系统当前时间
   long curTime = System.currentTimeMillis()
   // 流出的水量 rate
   long outWater = (curTime,refreshTime)/1000 * rate
   // 桶容量 
   curWater = max(curWater - outWater, 0)
  
   if (capcity < curWater) {
      curWater++
      return true
   }
  
  return false
  
  
 3、令牌桶算法
   // 系统当前时间
   long curTime = System.currentTimeMillis()
   // 放入临牌速度
   long generateToken = (curTime,refreshTime)/1000 * putTokenRate
   // 临牌容量 
   curToken = min(generateToken + curToken, capcity)
  
   if (curToken > 0) {
      curToken--
      return true
   }
  
  return false

6、api 刷 DB 不存在数据,如何处理?

  查询接口为空 -> 缓存(不是面试官答案)
  双重缓存

Go

1、空结构用过么? 不占用内存空间,具有很强语义性,通常作为占位符 通知子协程任务执行

2、new、make 区别? 作用:new 只分配内存,获取指向类型指针,make初始化内置数据结构 返回值:new返回的类型是指针,make是对应类型本身 范围:make只用于slice、map、channel,new可以对所有的

3、channel 用过么? 有缓存channel、无缓冲channel

4、切片与数组区别?切片扩容,扩容原理 切片底层就是数组,切片也叫动态数组

5、问输出什么? append() - 数组装不下,创建新的数组来保存切片

6、GMP模型讲解?如果发生阻塞应该怎么处理? G-携程 M-操作系统 P-上下文环境 发生阻塞,会另外起一个P继续运行,不会继续阻塞

7、全局G和本地G区别? 全局G:存放等待运行的G 本地G:存放等待运行的G,数量有限制,新建G优先添加本地,如果队列满了,则会把本地一半G移动到全局G队列

8、GMP模型对比线程模型有什么优缺点? 去除了内核切换消耗

9、线程切换与协程切换区别? 用户态-协程 用户态和内核台-线程

协程切换相比线程切换做的事情更少(都是用户态完成)

算法题

1、爬楼梯。(本质是斐波那次) leetcode 70

2、每日温度(暴力破解) leetcode 739 (最优解单调栈)

3、环形链表I(快慢指针) leetcode 141

4、环形链表II (快慢指针解决相遇点 + 快指针到头部 = 相遇点 == 环形入口) leetcode 142

总结

    1、加强项目常见问题总结
    2、redis 底层还需要多了解下,还有特殊场景运用
    3、leetcode 不刷不行
    
    总结:感概,互联网真的是越来越卷了,大学的给我们培训的老师也刚在成都被裁,今天问他,他还是在看数据库底层、redis底层实现等,不由的想到自己,可能也快了吧,说不定那天,给自己的一些建议,
    第一:既然互联网的已经如此的卷了,那么可以考虑利用空闲时间向其他方向发展了,周末帮帮大家遛遛狗、喂喂猫提升点额外收入也不错
    第二:做好随时被裁的准备,提升自我永不过时。可以计算机其他的有门槛的岗位,最近在了解算法、芯片验证。
    第三:20多岁的年纪就背负了百万债,经济不好,还是不要轻易买房吧,我现在就是被房贷绊住了脚,买房掏空了家里钱包,自己还负债,不买房结婚也给不了另一半一个家,真的是两难
    也希望大家能找到好的工作