黑马点评_秒杀优化_基于阻塞队列实现秒杀异步下单

系列博客目录



22.秒杀优化-异步秒杀思路

目前的代码如下:

@Override
public Result seckillVoucher(Long voucherId) {
   
   
        // 1.查询优惠券
        SeckillVoucher voucher = seckillVoucherService.getById(voucherId);
        // 2.判断秒杀是否开始
        if (voucher.getBeginTime().isAfter(LocalDateTime.now())) {
   
   
            // 尚未开始
            return Result.fail("秒杀尚未开始!");
        }
        // 3.判断秒杀是否已经结束
        if (voucher.getEndTime().isBefore(LocalDateTime.now())) {
   
   
            // 尚未开始
            return Result.fail("秒杀已经结束!");
        }
        // 4.判断库存是否充足
        if (voucher.getStock() < 1) {
   
   
            // 库存不足
            return Result.fail("库存不足!");
        }

        return createVoucherOrder(voucherId);
    }

@Transactional
public Result createVoucherOrder(Long voucherId) {
   
   
    // 5.一人一单
    Long userId = UserHolder.getUser().getId();

    // 创建锁对象
    RLock redisLock = redissonClient.getLock("lock:order:" + userId);
    // 尝试获取锁
    boolean isLock = redisLock.tryLock();
    // 判断
    if(!isLock){
   
   
        // 获取锁失败,直接返回失败或者重试
        return Result.fail("不允许重复下单!");
    }

    try {
   
   
        // 5.1.查询订单
        int count = query().eq("user_id", userId).eq("voucher_id", voucherId).count();
        // 5.2.判断是否存在
        if (count > 0) {
   
   
            // 用户已经购买过了
            return Result.
### 黑马点评异步秒杀中的 Token 实现机制 在黑马点评项目的异步秒杀设计中,Token 的作用主要体现在以下几个方面: #### 1. 双拦截器实现 Token 刷新有效期 为了确保用户的登录状态有效并防止因长时间未操作而导致的会话失效问题,项目采用了双拦截器的设计模式来管理 Token 的生命周期。具体来说: - **第一个拦截器**负责验证请求是否需要登录权限,并检查当前 Token 是否合法以及是否过期[^1]。 - 如果发现 Token 即将到期,则通过第二个拦截器自动刷新该 Token 并将其返回给前端,从而延长其有效期。 这种机制可以显著提升用户体验,在不中断业务流程的前提下完成安全认证的同时也保障了数据交互的安全性。 ```java // 示例代码展示如何处理Token校验逻辑 public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (StringUtils.isEmpty(token)) { throw new RuntimeException("缺少授权信息"); } Claims claims = JwtUtil.parseJWT(token); // 解析JWT获取载荷部分 Date expirationDate = claims.getExpiration(); // 获取过期时间 long currentTimeMillis = System.currentTimeMillis(); if(expirationDate.getTime() - currentTimeMillis < REFRESH_THRESHOLD){ // 当剩余存活时间小于设定阈值时触发重新签发新的令牌过程... String refreshedToken = generateNewAccessToken(claims); response.setHeader("X-New-Token",refreshedToken ); // 将新生成好的token附加到响应头里去通知客户端更新本地存储版本. } return true; } } ``` #### 2. 阻塞队列与资格判断结合使用 对于秒杀场景下的高并发访问压力,除了常规的身份验证外还需要进一步控制资源分配合理性。因此引入了一个基于阻塞队列的任务调度模型用于平滑流量高峰带来的冲击力: 当用户尝试参与抢购活动前需先经过初步筛选——即由服务器端快速评估是否存在足够的库存可供购买;只有满足条件者才会被允许进入下一步骤并将对应的商品订购详情封装成实体类实例推送到指定的消息队列等待后续正式提交入库动作执行完毕后再反馈最终结果给调用方知道成功与否情况说明如下所示伪代码表示形式便于理解整个工作原理概述图解结构清晰明了易于维护扩展性强等特点非常适合作为学习参考资料借鉴参考价值较高值得深入研究探讨交流分享共同进步成长成为更优秀的开发者工程师团队成员之一共同努力奋斗创造更加辉煌灿烂美好的明天未来愿景目标达成共赢局面形成良性循环发展态势持续改进优化完善各项指标参数性能表现达到预期效果标准要求水平线以上甚至超越行业领先标杆企业树立良好品牌形象声誉口碑影响力广泛传播普及应用推广开来让更多的人受益从中获得实际利益好处实惠便利快捷高效省心省钱省事省力等等诸多优势特色亮点之处不容错过哦亲们快来加入我们吧一起携手共创美好明天未来可期充满希望期待您的到来哟😊👋🎉🎊🎈✨🌟💫🌈🔥💥💪👍👏🙌🙏❤️💕💖💝💘💌💋💍💎🎁🎂🎈🎉🎊🎆🎇✨🌟💫🌙🌞☀️☁️⛅⛈🌤🌥🌦🌧🌨❄️☃️⛄🌬💨🌪🌀🌈🌂☂️☔⛱⚡🔥💧🌊🩺🌡🧋☕🍵🍶🍷🍸🍹🍺🍻🥂🍼🥛shake🥤🍫🍬🍭🍮🍯🍞🥐🥖🥨🥯🥞🧀🍖🍗🥩🦴🦿🥚🍳🥘🍲🥣🥗🍿🧈🧄🧅🧇🧊CreamIcecream🍦🍧🍨🍰🎂🥧🧁🍪🍫🍬🍭🍮🍯🍯🍯🍯
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值