1redis-list实现
@Slf4j
@RestController
public class ProductController {
public static final String LUASCRIPT;
static {
StringBuilder sb = new StringBuilder();
// 使用list实现
sb.append("local length = redis.call('LLEN', KEYS[1]);");
sb.append("
").append("if length < tonumber(ARGV[1]) then");
sb.append("
").append("redis.call('LPUSH', KEYS[1], ARGV[2])");
sb.append("
").append("return 1");
sb.append("
").append("else");
sb.append("
").append("return 2");
sb.append("
").append("end");
LUASCRIPT = sb.toString();
}
@Value("${server.port}")
String port;
@Autowired
ProductInfoMapper productInfoMapper;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@PostMapping("/snapUp")
public long snapUp(@RequestBody JSONObject json) {
System.err.println("snapUp---请求进入6");
// 1。判断是否已抢购
// 2.尝试减库存
// 3.保存抢购成功id
List<String> keys = ImmutableList.of("tuanmembers1");
RedisScript<Long> redisScript = new DefaultRedisScript<>(LUASCRIPT, Long.class);
Long left = redisTemplate.execute(redisScript, keys, 100, json.getStr("userId"));
log.info("抢购用户id{},结果{}", json.getStr("userId"), left);
return left;
}
}
2redis-set实现
@Slf4j
@RestController
public class ProductController {
public static final String LUASCRIPT;
static {
StringBuilder sb = new StringBuilder();
sb.append("local has = redis.call('SISMEMBER', KEYS[1], ARGV[1]);");
sb.append("
").append("if has == 1 then");
sb.append("
").append("return 0");
sb.append("
").append("else");
sb.append("
").append("local left = redis.call('decr', KEYS[2])");
sb.append("
").append("if left >= 0 then");
sb.append("
").append("redis.call('SADD', KEYS[1], ARGV[1])");
sb.append("
").append("return 1");
sb.append("
").append("else");
sb.append("
").append("return 2");
sb.append("
").append("end");
sb.append("
").append("end");
LUASCRIPT = sb.toString();
}
@Value("${server.port}")
String port;
@Autowired
ProductInfoMapper productInfoMapper;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@PostMapping("/snapUp")
public long snapUp(@RequestBody JSONObject json) {
System.err.println("snapUp---请求进入7");
// 1。判断是否已抢购
// 2.尝试减库存
// 3.保存抢购成功id
List<String> keys = ImmutableList.of("buyedUsers", "products");
RedisScript<Long> redisScript = new DefaultRedisScript<>(LUASCRIPT, Long.class);
Long left = redisTemplate.execute(redisScript, keys, json.getStr("userId"));
log.info("抢购用户id{},结果{}", json.getStr("userId"), left);
return left;
}
}
简单实现完成。