项目实现了什么功能?具体的业务流程?

你项目中的难点/亮点?怎么解决的?

Redis实现秒杀下单,一人一单,分布式锁。 下单时订单ID需要全局唯一ID,使用雪花算法实现(有递增性)。 1.查询优惠券 2.判断秒杀是否开始 3.判断秒杀是否已经结束 4.判断库存是否充足 5.扣减库存 6.创建订单(用户id、优惠券id、雪花算法生成的订单id) 7.返回订单id 第一版: 1.超卖问题:使用伪乐观锁【更新数据时可以用】解决(库存判断大于0即可成功【不超卖】,并不需要像乐观锁一样保证一次只有一个线程进入【库存与之前查到的一样,中间没线程更改库存】) 2.一人一单:使用悲观锁【这是插入数据】解决(synchronized锁上带事务的方法【调用同类中带事务注解的方法时需要获取spring的代理对象执行方法,直接调用this.method()则事务注解不会生效,因为事务注解的原理是用到了代理模式】,synchronized锁只能在单机下解决一人一单【只能锁住一个JVM,一个进程】) 第二版: 超卖问题、一人一单:使用分布式锁解决。分布式锁要注意: 1.SET [key] [value] NX EX [expire]其中value是获得到锁的线程的唯一id防止误删,要设置过期时间expire 2.判断锁是否是自己的和释放锁这两步要是原子操作【lua脚本】 第三版: 改进分布式锁(仿造 Redisson 的分布式锁): 1.可重入(使用hash结构,锁的value保存 获得到锁的线程的唯一id 和 重复获得锁的次数) 2.可重试(利用信号量和PubSub功能实现等待、唤醒,实现获取锁失败时的重试机制) 3.超时释放和看门狗续约(如果不自己指定锁的有效期的话,会使用看门狗程序定期重置锁的有效期实现永不过期【如果执行业务的机器挂掉了的话,看门狗程序也会挂掉,锁的有效期就不会重置,最后到时间就释放了,不会一直占着锁】,直到锁释放请求发出后才释放锁【设置锁的有效期为30秒,每30/3=10秒执行一次看门狗程序重置锁的有效期为30秒】) 4.主从一致性(如果是一主多从的话,主写从读,如果主节点中刚设置好的锁【写操作】还没同步到从节点时主节点故障,则主节点挂了后从从节点中选举出来的新主节点不会含有锁,则主从不一致了)(解决方法:使用联锁机制。联锁机制:设置多个主节点,每个主节点有自己的从节点,设置锁时要将锁写入每一个主节点中,获取锁时会向多个主节点都尝试获取,只有获取失败的锁的数量小于设定值时才表示锁获取成功,解决主从不一致的问题) 第四版: 异步秒杀:用 阻塞队列/消息队列 实现(1.新增秒杀优惠券的同时,将优惠券信息保存到Redis中 2.基于Lua脚本,判断秒杀库存、一人一单,决定用户是否抢购成功 3.如果抢购成功,将优惠券id和用户id封装后存入 阻塞队列/消息队列 4.开启线程任务,不断从 阻塞队列/消息队列 中获取信息,实现异步下单功能) 1.阻塞队列的问题:a.使用的时jdk的阻塞队列,使用JVM的内存,不限制的话,高并发时会内存溢出,所以要设置阻塞队列的长度,但设置阻塞队列的长度后,如果阻塞队列放满了的话就会阻塞卡住线程 b.阻塞队列只保存在内存中,有数据安全问题(a.服务器宕机的话内存里储的数据会丢失 b.线程从阻塞队列里面取出数据后,这个数据就不在阻塞队列里了,如果线程出现错误没能处理这个数据,则该数据就会丢失无法恢复或重新获取) 2.使用 消息队列 解决上述问题

如果你的项目要上线给千万用户使用,怎么优化你的项目?

1.分层 / 微服务 / 模块拆分 2.负载均衡 & 弹性伸缩 3.缓存 & 预热 4.静态资源 & 前端优化 5.限流 / 降流 / 流量控制 6.异步化 / 先快速响应后处理 7.数据库设计与优化 8.库存 & 扣库存一致性保证 9.分布式锁 / 乐观锁、悲观锁策略 10.消息队列 / 异步补偿机制 11.高可用(服务监控 & 熔断机制、降级策略) & 容错设计(各个组件【应用、缓存、数据库】要有冗余,避免单点故障)

全面介绍Spring Cloud Gateway的各个功能?Spring Cloud Gateway 的路由怎么用,说说代码?路由是什么规则?网关的作用?负载均衡有哪些算法?

SpringBoot引入MyBatis要做那些操作?

spring ioc 项目中哪里用到了ioc?

看过Redis源码吗?

怎么生成为一的业务ID?UUID、雪花算法怎么实现?怎么保证全局有序性?

雪花算法怎么解决时钟回拨?

说了美团leaf的解决方案,并且说了可以将机器号拆出几位作为时钟序号,每次回拨就自增。个人更喜欢后者,更轻量级

雪花算法的机器号怎么分配?

说了可以按ip进行hash,面试官问有没有成熟一些能直接落地的方案,我说可以预分配或者用redis的zset存储可用的机器号,新机器上线之后自己去认领一个最小的

什么是幂等?项目中怎么做的幂等?黑马点评里秒杀的幂等怎么做的?

从前端按钮置灰,业务层唯一幂等标识和数据库唯一索引兜底三个角度说了说 从业务层redis分布式锁和存储层唯一索引兜底两方面说。追问唯一索引具体怎么实现,回答在订单表中建立用户id+商品id+秒杀活动id三字段联合索引,确保同一用户在同一活动中只能购买一件同一商品

操作redis怎么保证原子性?说了lua脚本,追问平时有自己写过lua脚本嘛?

redis存商品库存用的什么数据结构?redis库存预占怎么实现的?

redis.call和redis.pcall

kafka的partition讲一下?如果某个topic中的某个消费者组想要提高自己的消费速率,可以从哪些方面优化?

Redis集群原理?用户请求访问一个key,服务端和Redis发生了什么?要在服务端决定key在哪个分片吗?

我说当然不是,服务端连任意一台实例即可,实例之间有信息交互,会帮你转发到正确的节点。说完对方没反馈,也没追问

redis如何配置?集群还是主从?如果主节点完成操作了,从节点还没同步,主节点就挂了怎么办?主从同步的方式的底层原理?

kafka生产者将消息发送给broker的三种方式?如果broker返回ack后挂了,副本还没同步就变成主节点导致的消息丢失怎么办?

几种同步策略,比如选出和broker的offset最接近的几个副本作为候选集,将候选集同步完成后才会真正视为刷盘成功并返回ack;比较严格的模式就是强制同步所有副本。具体还要根据业务来选择。

Nginx具体部署怎么写分流命令?nginx的相关原理和细节?

Docker File 中要写的命令有啥?