腾讯云一面(处男面)面经

上来先手撕lru , si完 问优化 
● 1. 如何实现一个lockfree 的 并发控制的缓存
  ○ 问ringbuffer的优点?  无锁并发 
● 2. lru结合lfu 实现兼顾折中, 结合优点的算法实现

● 也可以使用结构体记录, 在数据存储 基本单元上
● 面试官给的思路: 设计多个lruclass, 或者多个队列, hot, warm, cold 队列
  ○ 访问频率高的就放入hot里边( 比如多少次以上评价为高
  ○ 那么可以使用结构体, 记录每一个访问的次数
  ○ 那如何解决这个过期呢? 还能设计一个过期时间, 每次要检索这个数据的时候, 获取这个过期时间,看是否过期, 过期就直接丢掉,  不能访问了 

● 另一个思路 :  整体还是按照lru来,替换之前检查一下,前三个即将被替换的里面选择频率最低的删除,但是每个最多连续比较三次(我瞎说的)
  ○ 避免某些短时间频繁访问的节点被删除
    ■ 防止抖动现象产生 

布隆过滤器+ redis bitmap 的原理

● 自己的思路, 使用一个散列函数, 根据你当前的访问频率(设计一个struct node ), 去决定你随机的在list里边的插入位置
  ○ 如果频率比较高, 就将其在get 的时候放到靠近队头的位置
  ○ 频率比较低, 将其get 的时候放在队尾的位置(反正你短期大量访问, 后续频率上来了也会 逐渐的放到队头的
  ○ 并且反正插入和查询都是O1 
    ■ 如果是伪高频,  插入位置比较低, 后续也会直接被淘汰, 说明你根本不是真正的短期热数据
● 如果再问频率优化?
  ○ CMS, caffeine 的本地淘汰策略算法
● lru和lfu 的区别, lfu适合短期高频, 而lfu适合长期高频 数据

paxos和raft 的区别
● paxos 对比raft 的优点?
● raft 为啥容易实现? 和paxos对比? 不允许空洞->强leader->容易实现
● 选主的时候有没有 可能设计一个方案, 无锁选主? 
  ○ 1. 回答哨兵机制, 交给另一个集群哨兵去做选举这件事( 从而让数据节点专心做数据
  ○ 2. 问其他思路, 我说不锁不行, 不锁的话可能导致选票许诺给多个人->整个集群的逻辑总票数增加 -> 脑裂问题

均摊分析, 插入1e数据 ,扩容因子为4的 hash插入 的复杂度( 不会

● 两阶段提交的缺点 
  ○ 全局阻塞, io次数多( 根据mysql 的两阶段提交谈了谈, 三级队列优化思路
  ○ 没有事先通知 参与者, 不知道他可不可达, 宕机没 就直接提交了( 浪费网络带宽
  ○ 协调者比重太大,  一旦故障, 其他参与者也会跟着阻塞
  ○ 可能导致的数据库不一致, 比如commit阶段 ,参与者并没有收到提交请求, 导致落后 ( 可以引入mq解决消息消费问题
    ■ 回答 数据同步机制, 结合项目增量和全量, 以及mysql 的集群组提交策略(半数以上
● 解决,引入tcc,  不过侵入性较大, 并且实际效率也不一定高 (
全部评论
好的,一位算法菜鸡看到你的贴子后,默默去题库撕了一道LRU
2 回复 分享
发布于 04-22 08:24 辽宁
好难
点赞 回复 分享
发布于 05-10 20:51 广东
接好运
点赞 回复 分享
发布于 03-31 10:14 安徽
mark
点赞 回复 分享
发布于 03-28 11:44 广东
接好运
点赞 回复 分享
发布于 03-27 09:44 上海
接好运
点赞 回复 分享
发布于 03-27 09:07 湖北
接好运
点赞 回复 分享
发布于 03-27 08:32 浙江
接好运
点赞 回复 分享
发布于 03-26 17:59 湖北

相关推荐

05-10 17:11
门头沟学院 Java
秋招过去了好久,是时候更新一下面经了一面- 拷打实习项目- 实习项目亮点- 拷打项目(折磨)- 为什么要用两级缓存- caffine淘汰策略(没看过)- 为什么本地用top50,我说是top30行不行,(预估,预热)- 如果千万级是什么方案- 为什么要牺牲一致性(CAP, BASE扯了下)- 1000w用户需要怎么做- 定时器放在那里- 怎么做数据预热- 这里battle了巨久,感觉没有回答想要的点- springboot启动流程- java bean是什么(这里我说get set方法,他说应该从IOC里面说)- IOC是什么- IOC有什么好处(说了解耦,他问还有呢,从使用者和组件开发者的角度,我是真不会啊)- 又扯了巨久,真不会回答- 手撕:验证搜索二叉树二面- 项目拷打吧20min,其实感觉也没讲明白- raft协议- raft能应对脑裂吗- ES原理- 有实际运维部署经验吗)无- 时间久远其他问题记不得了- 手撕:交叉链表三面- 拷打项目- 说说SQL的执行的整个流程- 为什么要用逻辑执行计划- 你知道MySQL优化器会优化那些内容吗- innodb引擎索引结构- 二级索引结构- b+树和b树有什么优势- 为什么二级索引叶子节点要放主键值而不是一个指针)说的页分裂不知道对不对- 知道最左匹配原则吗- undo log, redo log, bin log都说说- redo log写到内存里如何保证能刷盘(3个参数)- 事务两阶段提交的过程- MVCC实现的原理- 进程和线程的区别- 用户态和内核态的区别- 怎么从用户态切换到内核态- 在编程的时候如何减少用户态到内核态的切换)这里纯在乱答- 协程有了解吗- 说下多路IO复用- 讲下4次挥手)捏马的有点忘了状态名字了,说了两遍才说懂- 为什么time_wait是2MSL为什么不是1MSL,为什么不是3MSL- fork知道吗,fork返回的值是什么- a = fork() b=fork() print(a,b) 这个最后产生几个进程,打印的内容是什么- 了解哪些排序- 快排复杂度推导一下- 归并的复杂度推导一下- 链表做归并的时候需要从中间节点断开,这个相比归并数组会影响时间复杂度吗- LRU思路讲下- 手撕:链表排序- 一共一个半小时,强度有点大,有些推导性质的东西确实不记得了,只记得结论了。还得下来多看下
点赞 评论 收藏
分享
评论
16
77
分享

创作者周榜

更多
牛客网
牛客企业服务