资讯动态

Redis 实战篇1.3 (优惠券秒杀)

发布时间:2026/8/20 11:54:25 来源:尧图企业网站定制
全局ID生成器特征满足递增性唯一性安全性Component public class RedisIdWorker { private final StringRedisTemplate stringRedisTemplate; public RedisIdWorker(StringRedisTemplate stringRedisTemplate) { this.stringRedisTemplate stringRedisTemplate; } /** * 开始时间戳 */ private static final long BEGIN_TIMESTAMP 1640995200L; /** * 序列号位数 */ private static final long COUNT_BITS 32; /** * ID生成器算法 * param keyPrefix * return */ public long nextId(String keyPrefix) { // 1.生成时间戳 LocalDateTime now LocalDateTime.now(); long nowSecond now.toEpochSecond(ZoneOffset.UTC); long timestamp nowSecond - BEGIN_TIMESTAMP; // 2.生成序列号 // 2.1.获取当前日期精确到天 String date now.format(DateTimeFormatter.ofPattern(yyyy:MM:dd)); // 2.2.自增长 long count stringRedisTemplate.opsForValue().increment(icr: keyPrefix : date); // 3.拼接并返回 (或运算因为后32位都为零直接或运算就可以拼接) return timestamp COUNT_BITS | count; } }单元测试类测试一下id生成的ID总结这个案例是Redis自增ID策略实现优惠券秒杀下单代码后续还会优化public class VoucherOrderServiceImpl extends ServiceImplVoucherOrderMapper, VoucherOrder implements IVoucherOrderService { Resource private ISeckillVoucherService seckillVoucherService; Resource private RedisIdWorker redisIdWorker; /** * 秒杀优惠券 * param voucherId * return */ Override Transactional 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(库存不足); } // 5.扣减库存 boolean success seckillVoucherService.update() .setSql(stock stock - 1) .eq(voucher_id, voucherId).update(); if (!success) { // 扣减失败 return Result.fail(库存不足); } // 6.创建订单 VoucherOrder voucherOrder new VoucherOrder(); // 6.1.订单id long orderId redisIdWorker.nextId(order); voucherOrder.setId(orderId); // 6.2.用户id Long userId UserHolder.getUser().getId(); voucherOrder.setUserId(userId); // 6.3.代金券id voucherOrder.setVoucherId(voucherId); save(voucherOrder); // 7.返回订单id return Result.ok(orderId); }

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价