redis spring-boot 配置
spring:
# redis配置
redis:
# Redis数据库索引(默认为0)
database: 1
# Redis服务器地址
host: ---
# Redis服务器连接端口
port: ---
# Redis服务器连接密码(默认为空)
password: ---
# 连接超时时间(毫秒)
timeout: 1000ms
jedis:
pool:
# 连接池最大连接数
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: 3000ms
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0
lua 秒杀脚本
String luaScript =
"local currentSku = -1 \n" +
"local deductSku = tonumber(ARGV[1])\n" +
"local num = tonumber(redis.call('hget',KEYS[1],KEYS[2]))\n" +
"if (num == nil or num < 0) then\n" +
" return currentSku\n" +
"end\n" +
"if(num >= deductSku) then\n" +
" currentSku = redis.call('hincrby',KEYS[1],KEYS[2],-1 * deductSku)\n" +
"end\n" +
"return currentSku";
脚本说明:
秒杀脚本中默认 当前扣完库存后的剩余库存数量为currentSku = -1;如果当前商品在缓存中的库存不存在或者不足 则直接返回-1 ;反之则扣除相应的库存,然后把剩余库存返回客户端;
注:如果返回客户端的值为0 表示是扣完本次所需库存后剩余库存为0 ,本次扣库存是成功的。
示例
1、先初始化(预热)商品123的库存
JedisPool jedisPool = new JedisPool( "redis.wenjs.com", 16380,null,"redis-wenjs");
Jedis jedis = jedisPool.getResource();
//生成100 库存
jedis.hset("goods::123","number","100");
jedis.close();
2、使用lua脚本扣库存
Object remainingNum= jedis.eval(luaScript, Arrays.asList("goods::123","number"), Arrays.asList("1"));
System.out.println(remainingNum);
返回
99
3、当初始库存设置为1时,执行扣除1个库存 返回0 ,表示本次扣除成功,剩余0个库存,在扣的话就返回-1,表示扣除失败;
当初始化库存设置为1时,执行扣除2个库存,返回 -1 ,标识扣除库存失败;
结束语:大神勿喷,请多多提建议。