|
|
@@ -31,8 +31,6 @@ public class StockDeductService {
|
|
|
|
|
|
// 库存扣减Lua脚本(预编译,提升高并发性能)
|
|
|
private static final DefaultRedisScript<Long> STOCK_DEDUCT_SCRIPT;
|
|
|
- // 锁释放Lua脚本(预编译)
|
|
|
- private static final DefaultRedisScript<Long> LOCK_RELEASE_SCRIPT;
|
|
|
|
|
|
// 库存扣减Lua脚本(优化后,增强健壮性)
|
|
|
static {
|
|
|
@@ -40,11 +38,6 @@ public class StockDeductService {
|
|
|
STOCK_DEDUCT_SCRIPT = new DefaultRedisScript<>();
|
|
|
STOCK_DEDUCT_SCRIPT.setScriptText("if redis.call('exists', KEYS[1]) ~= 1 then " + "return -2; " + "end " + "local stock_str = redis.call('get', KEYS[1]); " + "local stock = tonumber(stock_str); " + "if stock == nil then " + "return -3; " + "end " + "local deductNum_str = ARGV[1]; " + "local deductNum = tonumber(deductNum_str); " + "if deductNum == nil or deductNum <= 0 then " + "return -4; " + "end " + "if stock >= deductNum then " + "return redis.call('decrby', KEYS[1], deductNum); " + "else " + "return -1; " + "end");
|
|
|
STOCK_DEDUCT_SCRIPT.setResultType(Long.class);
|
|
|
-
|
|
|
- // 锁释放脚本保持不变
|
|
|
- LOCK_RELEASE_SCRIPT = new DefaultRedisScript<>();
|
|
|
- LOCK_RELEASE_SCRIPT.setScriptText("if redis.call('get', KEYS[1]) == ARGV[1] then " + "return redis.call('del', KEYS[1]) " + "else return 0 end");
|
|
|
- LOCK_RELEASE_SCRIPT.setResultType(Long.class);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -55,7 +48,7 @@ public class StockDeductService {
|
|
|
*/
|
|
|
public void initStock(Long productId, Long liveId, Integer initStock) {
|
|
|
String stockKey = RedisConstant.STOCK_KEY_PREFIX + liveId + ":" + productId;
|
|
|
- redisTemplate.opsForValue().set(stockKey, initStock, 24 * 60 * 60, TimeUnit.SECONDS);
|
|
|
+ redisTemplate.opsForValue().set(stockKey, initStock);
|
|
|
log.info("商品" + productId + "库存初始化完成,初始库存:" + initStock);
|
|
|
}
|
|
|
|