原创 抢购秒杀之redis高性能实现

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;
}

}
简单实现完成。

化繁为简,极致高效。 所有代码为本人原创,转载请联系本人。
原文地址:https://www.cnblogs.com/crissblog/p/14862026.html