个人简历常问问题

个人简历详情查看 -> 个人简历页 1. 异步秒杀机制的异步是如何实现的? 【正常秒杀的顺序】 查询优惠券 -> 判断秒杀库存 -> 查询订单 -> 校验是否一人一单 -> 扣减库存 -> 创建订单 【异步秒杀】 为了实现用户异步下单,其实就是把是否能够下单的判断逻辑和下单的操作拆分开。 采用Redis来判断是否有足够的库存和校验一人一单 如果满足条件,把用户、订单id、商品id保存到阻塞队列,直接给用户返回秒杀成功。 如果不满足条件,直接返回秒杀失败。 后台线程会去执行queue里边的消息 这样就可以实现异步的秒杀下单了,那么如果实现判断秒杀库存和校验一人一单呢? 【秒杀库存 + 一人一单】 用户下单之后,判断redis当中的库存key的value是否大于0 value > 0 -> 第2步 value <= 0 -> 直接返回库存不足 (返回1) 如果库存充足,判断redis当中的秒杀商品key的 set 集合是否已包含userid 包含userid, 说明用户已经下单了,直接返回当前用户已下单 (返回2) 不包含 userid -> 第3步 如果用户没有下单,将用户的 userid 存入 set 里面 (返回0) 【注意】 整个操作是原子性的,这样就确保了不会出现超卖现象和一人多单现象 -- 1.参数列表 -- 1.1.秒杀商品id local voucherId = ARGV[1] -- 1.2.用户id local userId = ARGV[2] -- 1.3.订单id local orderId = ARGV[3] -- 2.数据key -- 2.1.库存key local stockKey = 'seckill:stock:' .. voucherId -- 2.2.秒杀商品订单key local orderKey = 'seckill:order:' .. voucherId -- 3.脚本业务 -- 3.1.判断库存是否充足 get stockKey if(tonumber(redis.call('get', stockKey)) <= 0) then -- 3.2.库存不足,返回1 return 1 end -- 3.2.判断用户是否下单 SISMEMBER orderKey userId if(redis.call('sismember', orderKey, userId) == 1) then -- 3.3.存在,说明是重复下单,返回2 return 2 end return 0 【阻塞队列实现下单】 ...

February 27, 2025 · 1 min · SwimmingLiu