- 面试整个过程大约1个小时
- 回答的中规中矩吧 很多问题回答的不具体 难受死我了
- 非常简单的算法题
- 下面列出来了面试步骤
- 这里面有一点就是面试官本来想问问我数据结构这一块的问题 但是我说不太熟悉 他就没问了
1. 简单介绍个人信息 略
2. 介绍简历上的项目 略
3. 什么是分布式事务 主要用来干什么
4. 什么是数据库事务 为什么要用到事务
5. redis数据类型有哪些
6. redis持久化简单介绍有哪几种方式 有什么区别
7. redis热数据简单讲一下
8. 讲一下你在项目数据迁移过程中 怎么保证数据不会丢失 或者说 新数据跟老数据不会出现丢失或重复
在说一下服务端重启完成后使用新的数据库链接会出现什么情况
(场景就是线上一直有项目在输出数据,你同时又在迁移数据到新的数据库,
迁移完成后,业务服务端会重启 因为使用新迁移的数据库链接)
9. 什么是聚簇索引
10. mysql存贮数据用到的是什么数据结构 有什么特点
12. 从浏览器访问www.baidu.com 这从本地到网络访问具体步骤介绍一下
13. 讲一下tcp/ip三次握手
14. 算法题(有时间限制的 到了一小时面试时间就不能写了)
按顺序打印1-100数字,要求有生产者跟消费者 下面是我写的
面试之前在网上刚好看了一下消息队列实现过程 直接稍微改动了一下代码
写的可能不是最好的方案 如果有更好的写法欢迎私信我 给我康康
本来这种简单的算法 面试官是考查我对channel 的熟悉程度
结果我没用到channel
还有就是我应该用协程生产和消费的 这里都没用到
算法虽然是实现了
但这不是面试官想要的结果
因为面试时间有限
在不写就没机会了
type Goqueque struct {
stack []int
back []int
lock sync.Mutex
}
func newGoqueque() Goqueque {
res := Goqueque{
stack: make([]int, 0),
back: make([]int, 0),
}
return res
}
func (g *Goqueque) send(x int) {
g.lock.Lock()
defer g.lock.Unlock()
g.stack = append(g.stack, x)
}
func (g *Goqueque) pop() {
g.lock.Lock()
defer g.lock.Unlock()
for len(g.stack) != 0 {
val := g.stack[len(g.stack)-1]
g.stack = g.stack[:len(g.stack)-1]
g.back = append(g.back, val)
}
res := g.back[len(g.back)-1]
g.back = g.back[:len(g.back)-1]
fmt.Println(res)
}
func (g *Goqueque) empty() bool {
if len(g.stack) == 0 && len(g.back) == 0 {
return true
}
return false
}
func exec() {
g := newGoqueque()
for i := 1; i <= 100; i++ {
g.send(i)
}
for !g.empty() {
g.pop()
}
}