LUA脚本
private static final String UNLOCK_LUA = "local mytabale = {} \n" +
" if redis.call('GET', KEYS[1]) == false then \n" +
" redis.call('SET', KEYS[1], 1)\n" +
" redis.call('expire',KEYS[1],86400)\n" +
" if redis.call('GET', KEYS[1]) == ARGV[1] then\n" +
" return 1\n" +
" else \n" +
" redis.call('incrBy', KEYS[1], 1)\n" +
" return 0\n" +
" end \n" +
" elseif redis.call('GET', KEYS[1]) == ARGV[1] then\n" +
" redis.call('DEL', KEYS[1])\n" +
" return 1 \n" +
" else \n" +
" redis.call('incrBy', KEYS[1], 1) \n" +
" mytabale[1] = 0 \n" +
" return mytabale \n" +
" end";
Service
/**
* lua 原子脚本
*
* @param key
* @param val
* @return
*/
public Long checkLastOver(String key, String val) {
try {
RedisCallback<Long> callback = (connection) -> {
return (Long) connection.eval(UNLOCK_LUA.getBytes(), ReturnType.INTEGER, 1, new byte[][]{key.getBytes(), val.getBytes()});
};
return (Long) this.redisTemplate.execute(callback);
} catch (Exception var5) {
log.error("deal.lua.releaseLock.error {}", com.alibaba.fastjson.JSONObject.toJSONString(var5));
}
return null;
}
Controller
@Override
public CommonResponse<String> test() {
for(int i=0;i<200;i++){
final int j = i;
new Thread(()->{
if(j == 10){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
bizHubProductService.checkLastOver("HUB:SYNC:LAST:test",
String.valueOf(200));
}
System.out.println(j);
}).start();
}
return CommonResponse.success();
}