优惠卷秒杀——一人一单

编程入门 行业动态 更新时间:2024-10-25 20:30:29

优惠卷秒杀——<a href=https://www.elefans.com/category/jswz/34/1726118.html style=一人一单"/>

优惠卷秒杀——一人一单

 

利用stringRedisTemplate生成唯一的id

package com.hmdp.service.impl;import com.hmdp.dto.Result;
import com.hmdp.dto.UserDTO;
import com.hmdp.entity.SeckillVoucher;
import com.hmdp.entity.VoucherOrder;
import com.hmdp.mapper.VoucherOrderMapper;
import com.hmdp.service.ISeckillVoucherService;
import com.hmdp.service.IVoucherOrderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.utils.RedisIdWorked;
import com.hmdp.utils.SimpleRedisLock;
import com.hmdp.utils.UserHolder;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.time.LocalDateTime;@SuppressWarnings("all")
@Service
public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderService {@Autowiredprivate ISeckillVoucherService seckillVoucherService;@Autowiredprivate RedisIdWorked redisIdWorked;@Autowiredprivate StringRedisTemplate stringRedisTemplate;/*** 限时优惠卷的秒杀* @param voucherId* @return*/@Overridepublic Result seckillVoucher(Long voucherId) {//1.查询优惠卷SeckillVoucher voucher = seckillVoucherService.getById(voucherId);if(voucher==null){//该卷不存在return Result.fail("秒杀卷不存在");}//2.判断在秒杀开始前//得到秒杀开始时间LocalDateTime beginTime = voucher.getBeginTime();if (beginTime.isAfter(LocalDateTime.now())){//活动尚未开始return Result.ok("活动尚未开始");}//3.判断在秒杀开始后LocalDateTime endTime = voucher.getEndTime();if(endTime.isBefore(LocalDateTime.now())){return Result.ok("活动已经结束");}//4.判断库存是否充足Integer stock = voucher.getStock();if(stock<1){return Result.fail("库存不足");}UserDTO user = UserHolder.getUser();Long id = user.getId();SimpleRedisLock lock = new SimpleRedisLock("order:"+id,stringRedisTemplate);//尝试获取锁boolean flag = lock.tryLock(1200L);if(!flag){return Result.fail("一个人只能下一单");}try {//如果这个类本身调用是不具备管理事务的,如果使用Spring管理可以控制事务的一致性//获取一个spring的代理对象IVoucherOrderService proxy =(IVoucherOrderService) AopContext.currentProxy();//利用spring代理对象确保事务的一致性return proxy.createVoucherOrder(voucherId);} finally {//释放锁lock.unlock();}}@Transactionalpublic Result createVoucherOrder(Long voucherId){//5.保证一人一单//5.1用户idUserDTO user = UserHolder.getUser();Long id = user.getId();Integer count = query().eq("user_id", id).eq("voucher_id", voucherId).count();if(count>0){return Result.fail("该用户已经购买");}//6.扣减库存seckillVoucherService.update().setSql("stock=stock-1").eq("voucher_id",voucherId).gt("stock",0)//stock>0.update();//7.创建订单VoucherOrder voucherOrder = new VoucherOrder();//7.1订单idlong order = redisIdWorked.nextId("order");voucherOrder.setId(order);//7.2用户idvoucherOrder.setUserId(id);//7.3购买代金卷的idvoucherOrder.setVoucherId(voucherId);save(voucherOrder);//8.返回订单idreturn Result.ok(order);}}
@Autowired
private ISeckillVoucherService seckillVoucherService;
@Autowired
private RedisIdWorked redisIdWorked;
/*** 限时优惠卷的秒杀* @param voucherId* @return*/
@Transactional//同时操作两张表 保持数据库的一致性
@Override
public Result seckillVoucher(Long voucherId) {//1.查询优惠卷SeckillVoucher voucher = seckillVoucherService.getById(voucherId);if(voucher==null){//该卷不存在return Result.fail("秒杀卷不存在");}//2.判断在秒杀开始前//得到秒杀开始时间LocalDateTime beginTime = voucher.getBeginTime();if (beginTime.isAfter(LocalDateTime.now())){//活动尚未开始return Result.ok("活动尚未开始");}//3.判断在秒杀开始后LocalDateTime endTime = voucher.getEndTime();if(endTime.isBefore(LocalDateTime.now())){return Result.ok("活动已经结束");}//4.判断库存是否充足Integer stock = voucher.getStock();if(stock<1){return Result.fail("库存不足");}UserDTO user = UserHolder.getUser();Long id = user.getId();synchronized (id.toString().intern()){//toString会重新开辟一块空间加上intern()方法时会在常量池中找内容相同的字符串//如果这个类本身调用是不具备管理事务的,如果使用Spring管理可以控制事务的一致性//获取一个spring的代理对象IVoucherOrderService proxy =(IVoucherOrderService) AopContext.currentProxy();//利用spring代理对象确保事务的一致性return proxy.createVoucherOrder(voucherId);}}@Transactional
public Result createVoucherOrder(Long voucherId){//5.保证一人一单//5.1用户idUserDTO user = UserHolder.getUser();Long id = user.getId();Integer count = query().eq("user_id", id).eq("voucher_id", voucherId).count();if(count>0){return Result.fail("该用户已经购买");}//6.扣减库存seckillVoucherService.update().setSql("stock=stock-1").eq("voucher_id",voucherId).gt("stock",0)//stock>0.update();//7.创建订单VoucherOrder voucherOrder = new VoucherOrder();//7.1订单idlong order = redisIdWorked.nextId("order");voucherOrder.setId(order);//7.2用户idvoucherOrder.setUserId(id);//7.3购买代金卷的idvoucherOrder.setVoucherId(voucherId);save(voucherOrder);//8.返回订单idreturn Result.ok(order);
}

更多推荐

优惠卷秒杀——一人一单

本文发布于:2024-03-15 12:06:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1738847.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:一人   优惠卷   秒杀

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!