redis lua脚本使用示例


redis lua脚本使用示例

 

示例:使用redis lua脚本模拟高并发扣减库存

 

 

*******************

service 层

 

HelloService

@Service
public class HelloService {

    private String script="local store=tonumber(redis.call('get','store')) \n"
            +"if(store<= 0) then return '0' \n"
            +"else store=store-1; end \n"
            +"redis.call('set','store',store) \n"
            +"redis.call('rpush','decrease_time',ARGV[1]) \n"
            +"return '1' ";

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    public void setStore(Integer store){
        stringRedisTemplate.boundValueOps("store").set(store.toString());
    }

    public void decreaseStore(String user_decrease_time){
        RedisScript redisScript=RedisScript.of(script,String.class);
        Integer num=Integer.parseInt((String) Objects.requireNonNull(stringRedisTemplate.execute(redisScript, null,user_decrease_time)));
        if (num.equals(0)){
            System.out.println("库存扣减完毕");
        }
    }

    public String getStore(){
        return stringRedisTemplate.boundValueOps("store").get();
    }

    public List<String> getDecreaseTime(){
        return stringRedisTemplate.boundListOps("decrease_time").range(0,-1);
    }
}

 

 

*******************

controller 层

 

HelloController

@RestController
public class HelloController {

    @Resource
    private HelloService helloService;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @RequestMapping("/set")
    public String setStore(){
        helloService.setStore(1000);
        return "success";
    }

    @RequestMapping("/decrease")
    public String decreaseStore(){
        ExecutorService executorService= Executors.newFixedThreadPool(10);

        for (int i=0;i<10000;i++){
            int finalI = i;
            executorService.submit(() ->
                    helloService.decreaseStore("瓜田李下"+ finalI +"-"+System.currentTimeMillis()));
        }
        return "success";
    }

    @RequestMapping("/get")
    public String getStore(){
        String store=helloService.getStore();
        System.out.println("剩余库存为:"+store);
        return store;
    }

    @RequestMapping("/get2")
    public List<String> getDecreaseTime(){
        List<String> list=helloService.getDecreaseTime();
        list.forEach(System.out::println);
        System.out.println(list.size());

        return list;
    }

}

 

 

*******************

使用测试

 

控制台部分输出

瓜田李下950-1574385814753
瓜田李下951-1574385814753
瓜田李下954-1574385814753
瓜田李下953-1574385814753
瓜田李下955-1574385814753
瓜田李下956-1574385814753
瓜田李下957-1574385814753
瓜田李下958-1574385814753
瓜田李下959-1574385814754
瓜田李下960-1574385814754
瓜田李下961-1574385814754
瓜田李下962-1574385814754
瓜田李下963-1574385814754
瓜田李下964-1574385814754
瓜田李下966-1574385814754
瓜田李下965-1574385814754
瓜田李下968-1574385814755
瓜田李下967-1574385814755
瓜田李下969-1574385814755
瓜田李下970-1574385814755
瓜田李下971-1574385814756
瓜田李下972-1574385814756
瓜田李下973-1574385814756
瓜田李下974-1574385814756
瓜田李下975-1574385814756
瓜田李下976-1574385814756
瓜田李下977-1574385814756
瓜田李下978-1574385814756
瓜田李下979-1574385814756
瓜田李下980-1574385814757
瓜田李下981-1574385814757
瓜田李下982-1574385814757
瓜田李下983-1574385814757
瓜田李下984-1574385814757
瓜田李下985-1574385814757
瓜田李下986-1574385814757
瓜田李下987-1574385814758
瓜田李下989-1574385814758
瓜田李下988-1574385814758
瓜田李下990-1574385814758
瓜田李下991-1574385814758
瓜田李下992-1574385814758
瓜田李下993-1574385814758
瓜田李下994-1574385814759
瓜田李下995-1574385814759
瓜田李下996-1574385814759
瓜田李下997-1574385814759
瓜田李下998-1574385814759
瓜田李下1000-1574385814760
1000

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值