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