百度后端提前批一面凉经
项目拷打
- 项目中主要负责的模块,在这个项目开发的过程中,你遇到的难点是什么?然后你是怎么解决的?
说了维护设备在线状态,用的redis
疯狂拷打redis
- 那你们的 Redis 是用的集群还是用的什么?还是自维护的一个?线上使用也是 Redis 单实例这种吗?
单体架构,说的一个
- 线上用单实例不怕崩了整个服务没法用吗?
就是存在这个问题,但是就是以后就是改成分布式
- 那你说一下如果让你来改造的话,你如何实现整个服务的高可用?
- 那是什么原因导致你们想把这个设备在线状态从数据库改到 Redis
- 那Redis,假如我 Redis 服务挂了 Redis 服务,就如果你用集群或者说涉及到我 Redis 实例迁移,就是需要对 Redis 进行一定时间的停服处理,那在停服这段时间里的这些在线离线状态如何处理呢?
停服处理的话, Redis 它是有那个持久化策略的就可以,如果停服的话就可以通过嗯, RDB 或者是 AOF 来进行恢复。
如果 Redis 不可用的话,就直接通过数据流来判断。就是可以在本地再加一个缓存,然后缓存设备在线状态
- 你们的设备量大概有多大呀?
mysql拷打
- 你刚才说你们的 MySQL 会搭了个集群,嗯,处理上亿的数据这块你有哪些了解?就例如说我 MySQL 一个表合理的存储数据量大概是多大
2, 000 万条的样子
- 一张表,那如果多了应该怎么做呢?
水平分表,说了两个优化
- 联合索引
- 自定义基于时间的分片算法
- 你刚才说到了你们的优化,那对于例如说我现在 MySQL 有一个 SQL 语句,我知道它比较慢。然后我现在要优化它,那你会怎么去?看应该从哪些方面进行优化。
开始八股烤打
Mysql
1. 手写sql,用户表,然后里边有主键id,有name、有age
- 表里边所有的用户,他的平均年龄是多大?
- 统计每个年龄段,按每个年龄分组,然后每个年龄的人数大于 50 个的年龄是哪些
2. 拷打锁和事务
- 先开启了事务A,在事物 A 里边执行 delete user 里边这个 id = 1 的这条数据我没有提交事务,然后我又开启了事务b,在事务 b 里边我执行update id=1的数据, set name 等张三改成李四,提交事务,这个 update 能不能执行成功?
锁忘得一干二净!!!
说错了,进而引导,问我知道mysql的哪些锁
3. MVCC
- 我先开启了事务a,开启了之后我什么都没有执行,然后我又开启了事务b,在事务 b 里边更新了id=1的数据,把name从张三改成了李四,然后在事物 b 里边提交了,提交之后回到了事物A。事物 A执行了 select id=1 的数据,他查到的是新数据还是旧数据?
说错了,进而问我MVCC的原理
- 追问readView的生成时机?
- 你觉得是哪个隔离级别?是在事务开启的时候生成readView
Redis
- Redis 这么快的原因?
- Redis 的数据类型
- 缓存一个类似于京东、淘宝那种购物车的用户信息,嗯,你会考虑用哪种结构?
- 具体怎么存储
- 怎么用redis命令更新购物车
- 如果我囤这个购物车的数据的这个哈希这个表它满了,需要扩容。如果让你来设计 Redis 的哈希数据类型的扩容,你会怎么考虑?
redis的hash底层是可以用dict和ziplist
其实是想问这两个底层数据结构是怎么扩容的
我说的是dict的渐进式rehash
dict的渐进式rehash的find,insert,update,delete分别先操作新旧哪个hashtable
这里面试官说错了,update/find/delete都会先去看h0,给我绕晕了 redis7.0是这样的
JUC
- 构建一个线程池,可以指定哪些参数?
- 现在我创建了一个线程池,核心线程数是 10 个, 最大线程数是 20 个,堵塞队列是 100 个,我现在提交过来 105 个请求。 105 个有哪些任务会被执行?
- 如果再来 10 个任务呢?
- 多线程都会遇到线程不安全的问题,一般是怎么解决的?
- sync的关键字它可以用在哪些地方?
- synchronize和reentranLock区别
JVM
- 垃圾回收算法?
- 垃圾回收器你用过哪些?
- 你有进行过调优吗?
我说没有!!!!
- 那假如让你来设置它的几个核心参数,你知道哪些?
我说了堆
- 你知道堆的大小怎么指定吗?指定的参数?
- 你们服务中指定的是多大的?
回答默认的大小
- 默认的大小是多大?
- 你们的垃圾回收器服务里用的是哪个?
手撕
打家劫舍
复盘总结
- 底层看是看了,但是还不够细
- mysql的锁太久没复习了,忘得一干二净
- 项目问redis崩了怎么办,以后就说做了集群化部署,虽然项目架构还是单体
- jvm实战调参数,实践一下
- redis和mysql的底层!!
- 这个面试官的风格就是全是实际的场景问题,需要真正理解底层才能答出来
- 不过面试官很有耐心,知道我答错了,会问我原理,慢慢引导,面试体验感还是很不错,也学到了不少