public class RedisBillLockHandler implements IBatchBillLockHandler {
private static final Logger LOGGER=LoggerFactory.getLogger(RedisBillLockHandler.class);
private static final int DEFAULT_SINGLE_EXPIRE_TIME=3;
private static final int DEFAULT_BATCH_EXPIRE_TIME=6;
private final JedisPool jedisPool;
public RedisBillLockHandler(JedisPool jedisPool) {
this.jedisPool=jedisPool;
}
public boolean tryLock(IBillIdentify billIdentify) {
return tryLock(billIdentify, 0L, null);
}
public boolean tryLock(IBillIdentify billIdentify, long timeout, TimeUnit unit) {
String key=(String) billIdentify.uniqueIdentify();
Jedis jedis=null;
try {
jedis=getResource();
long nano=System.nanoTime();
do {
LOGGER.debug("try lock key: " + key);
Long i=jedis.setnx(key, key);
if (i==1) {
jedis.expire(key, DEFAULT_SINGLE_EXPIRE_TIME);
LOGGER.debug("get lock, key: " + key + " , expire in " + DEFAULT_SINGLE_EXPIRE_TIME + " seconds.");
return Boolean.TRUE;
} else { // 存在锁
if (LOGGER.isDebugEnabled()) {
String desc=jedis.get(key);
LOGGER.debug("key: " + key + " locked by another business:" + desc);
}
}
if (timeout==0) {
break;
}
Thread.sleep(300);
} while ((System.nanoTime() - nano) < unit.toNanos(timeout));
return Boolean.FALSE;
} catch (JedisConnectionException je) {
LOGGER.error(je.getMessage(), je);
returnBrokenResource(jedis);
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
} finally {
returnResource(jedis);
}
return Boolean.FALSE;
}
public void lock(IBillIdentify billIdentify) {
String key=(String) billIdentify.uniqueIdentify();
Jedis jedis=null;
try {
jedis=getResource();
do {
LOGGER.debug("lock key: " + key);
Long i=jedis.setnx(key, key);
if (i==1) {
jedis.expire(key, DEFAULT_SINGLE_EXPIRE_TIME);
LOGGER.debug("get lock, key: " + key + " , expire in " + DEFAULT_SINGLE_EXPIRE_TIME + " seconds.");
return;
} else {
if (LOGGER.isDebugEnabled()) {
String desc=jedis.get(key);
LOGGER.debug("key: " + key + " locked by another business:" + desc);
}
}
Thread.sleep(300);
} while (true);
} catch (JedisConnectionException je) {
LOGGER.error(je.getMessage(), je);
returnBrokenResource(jedis);
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
} finally {
returnResource(jedis);
}
}
public void unLock(IBillIdentify billIdentify) {
List
list.add(billIdentify);
unLock(list);
}
public boolean tryLock(List
return tryLock(billIdentifyList, 0L, null);
}
public boolean tryLock(List
Jedis jedis=null;
try {
List
List
jedis=getResource();
long nano=System.nanoTime();
do {
// 构建pipeline,批量提交
Pipeline pipeline=jedis.pipelined();
for (IBillIdentify identify : billIdentifyList) {
String key=(String) identify.uniqueIdentify();
needLocking.add(key);
pipeline.setnx(key, key);
}
LOGGER.debug("try lock keys: " + needLocking);
// 提交redis执行计数
List
Redis实现分布式锁
作者:Redis实现分布式锁 来源:未知 2022-06-21 09:11 阅读:次
publicclassRedisBillLockHandlerimplementsIBatchBillLockHandler{privatestaticfinalLoggerLOGGER=Logger

