redis lua 秒杀脚本

本文介绍了如何在Spring Boot应用中配置Redis,包括数据库索引、服务器地址、端口等,并展示了使用Lua脚本进行秒杀操作的示例。通过预设库存、执行Lua脚本扣除库存,演示了脚本在确保并发安全性方面的应用。
摘要由CSDN通过智能技术生成

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 ,标识扣除库存失败;

结束语:大神勿喷,请多多提建议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值