1.介绍自己,巴拉巴拉
2.面试官谈到了redis
问:redis在项目中你们主要用来干什么的?
答:分布式锁、存储图标信息
问:你们hash类型主要用来做什么?
答:主要用来存储token
问:token不应该怎么存吧
答:尴尬
问:redis存储list数据的几个基本指令
答:lpush、lpop(尴尬,要注意list是队列有顺序的)
问:redis的redission包具体解决了哪些问题,当中的过期时间会导致什么场景
答:没答好(建议重新归纳总结一下)
问:怎么解决redis的读写不一致的问题
答:redis有一个注解,是针对更新接口的,一旦更新了这个接口就会让redis即时刷新(应该说细一点,这个注解是怎么工作的,是先删后插还是怎么样)
问:一个热点key失效,导致缓存击穿怎么处理(但是他这里说他是缓存穿透,我记得可以用布隆过滤器去解决缓存穿透,但他说错了,导致我不敢说)
答:没答好
3.开始聊MySQL了
问:mysql慢查询怎么解决的?怎么去查慢查询日志的
答:我们一般都是会在mysql中开启慢查询日志的,生成一个slow.log文件,然后通过查询语句去查到慢sql(最好说一下什么语句),或者是通过测试定位到慢接口,去对他进行处理
问:怎么去优化sql语句
答:使用explain关键字去分析sql语句,join用大表连小表,是否连表过多,是否使用到了索引,索引是否遵循最左前缀原则
问:索引的类型有哪些
答:索引分为聚簇索引和非聚簇索引。聚簇索引就是主键,非聚簇索引有普通索引、唯一索引、全文索引。
问:select * from 表 where id = 1 和 select id from 表 where id = 1哪个效率高一些?
答:差不多,因为b+树的特性,它的主键是带着这一行的其他字段的,如果忽略掉网络的话,两者是一样的。
4.聊了一下项目秒杀
问:如果秒杀成功了,下单失败了
答:我这边经过redis实际上就是完成了下单了,后续对db的操作交给rabbitmq做,rabbitmq如果失败会去重试的,我这边最多只能在消费者那边catch到,记录到日志做补偿机制(建议看一下高并发场景下怎么处理的)
问:生产者生产完以后返回一个什么数据
答:返回一个布尔型的数据
问:你怎么样防止超卖的,请说出多个方案
答:1.加分布式锁 2.用rabbitmq顺序消费 3.mysql设置事务隔离级别 serilizable(面试官补充可以用乐观锁去做)
问:mysql集群怎么样保证数据的一致性
答:通过读取binlog巴拉巴拉(应该是错的)