Redis分布式锁
import java.util.Collections;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;
public class RedisLock {
private static final String SET_IF_NOT_EXIST = "NX";
private static final String SET_WITH_EXPIRE_TIME = "PX";
private static final String LOCK_MSG = "OK";
private static final Long UNLOCK_MSG = 1L;
@Autowired
private MultiJedisShardedPool multiJedisShardedPool;
private static final int TIME = 1000;
public Jedis getJedis(String key){
WeBankJedisPartition partition = getPartition(key);
return partition.getReadWriteResource();
}
public boolean tryLock(String key, String request) {
String result = this.getJedis(key).set( key, request, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, 10 * TIME);
if (LOCK_MSG.equals(result)){
return true ;
}else {
return false ;
}
}
public boolean unlock(String key,String request){
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = null ;
if (this.getJedis(key) instanceof Jedis){
result = (this.getJedis(key)).eval(script, Collections.singletonList(key), Collections.singletonList(request));
}else {
return false ;
}
if (UNLOCK_MSG.equals(result)){
return true ;
}else {
return false ;
}
}
private WeBankJedisPartition getPartition(String key){
return multiJedisShardedPool.getJedisPartition(key);
}
}