# 面试总结
从毕业开始就经过内推去了一家小公司 直到现在每一份工作基本上都是朋友介绍 没有正经面试过一次 今天是第一次,非常紧张,结果肯定是挂了,但是自己总结一下。
1.秒杀 高并发抽奖 怎么设计。
答:消息队列 限流 削峰 负载均衡。
面试官:到redis这一步还是很大的qps 还是扛不住怎么办。
答:redis都扛不住了 说明到redis的瓶颈了 不知道怎么处理。
面试官:有没有考虑在内存中做随机丢弃处理。
我:我心想这不还是在前面限流啊 我以为能突破redis瓶颈呢。
2.数据库隔离级别有哪些 在可重复读情况下 一个事务里查询两次数据(同时其他事务在修改)结果是否一致 为什么一致
答:读未提交 读已提交 可重复读 (串行化没想起) 结果一致 因为在事务开启之后 第一次查询的数据就缓存起来了 后面查询的都是这个数据
面试官:因为mysql在第一次查询的时候快照了这个数据 后面查询的都是快照里面的
扩展:
- mysql默认innodb引擎事务隔离级别是rr 在该隔离级别下,事务能保证在事务内所有读取的数据都是一致的,即在同一个事务内,多次读取同一数据,结果都是相同的,不会被其他事务所影响。可以防止脏读不可重复读 但是不能防止幻读 幻读是指在一个事务内部,多次查询返回的结果集不一样。这是因为在查询期间,其他事务可能插入了新的行,造成了新的查询结果。通过mvvc(多版本并发控制)机制解决幻读 但是可能在同一个事务中读到的是旧版本的数据
- 数据库的读操作可以分为快照读、当前读。
- 快照读 select * from XXX
- 当前读 select * from XXX for update, lock in share mode, update insert delete 等
3.缓存穿透 缓存击穿 缓存雪崩 分别是什么 如何解决
答:
- 穿透就是访问一个不存在的数据 会直接打到数据库 可以缓存一下这个不存在数据的结果
- 击穿是在数据过期的瞬间 大量请求直接打到数据库上 可以设置热点数据不过期 加锁
- 雪崩就是大量缓存在同一时段失效 请求也会直接到数据库上 可以从过期时间上设计 尽量分散过期
扩展:穿透这里可以用布隆过滤器
- 添加元素的原理
- 将要添加的元素给k个hash函数
- 得到对应于位数组上的k个位置
- 将这k个位置设置成 1
- 查询元素原理
- 将要查询的元素给k个hash函数
- 得到对应数组的k个元素
- 如果k个位置中有一个为0,则肯定不在集合中
- 如果k个位置全部为1,则有可能在集合中
4. 聚簇索引和非聚簇索引的区别
答:聚簇索引在b+树上存储的是索引+数据 非聚簇索引则是只存储索引 通过索引再去拿数据
5. 联合索引的匹配原则
答:最左匹配原则 匹配到的字段才能走索引 一旦不匹配 后面的都不走索引
扩展:联合索引的实现原理
按照索引列的顺序,将这些列的值进行组合,然后在这个组合值上建立索引。这跟单列索引的实现方式并无差异,只是在计算索引值时涉及的列更多罢了。由于索引中包含多个列,因此在进行查询优化时,查询优化器会考虑到这些列的数据分布和查询模式,来决定是否使用索引以及如何使用索引。