package com.jarvis.cache.lock;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
public class ShardedJedisLockWithLua extends AbstractRedisLockWithLua {
private static final Logger logger=LoggerFactory.getLogger(ShardedJedisLockWithLua.class);
private ShardedJedisPool shardedJedisPool;
public ShardedJedisLockWithLua(ShardedJedisPool shardedJedisPool) {
this.shardedJedisPool=shardedJedisPool;
}
private void returnResource(ShardedJedis shardedJedis) {
shardedJedis.close();
}
@Override
protected Long eval(byte[] lockScript, String key, List<byte[]> args) {
ShardedJedis shardedJedis=null;
try {
shardedJedis=shardedJedisPool.getResource();
Jedis jedis=shardedJedis.getShard(key);
List<byte[]> keys=new ArrayList<byte[]>();
keys.add(key.getBytes("UTF-8"));
return (Long)jedis.eval(lockScript, keys, args);
} catch(Exception ex) {
logger.error(ex.getMessage(), ex);
} finally {
returnResource(shardedJedis);
}
return 0L;
}
@Override
protected void del(String key) {
ShardedJedis shardedJedis=null;
try {
shardedJedis=shardedJedisPool.getResource();
Jedis jedis=shardedJedis.getShard(key);
jedis.del(key);
} finally {
returnResource(shardedJedis);
}
}
}