Commit 44a3923f authored by liaozan's avatar liaozan 🏀

Add leaseTime option for RedisLockUtils

parent 067fcbff
...@@ -23,6 +23,7 @@ import java.util.concurrent.ThreadLocalRandom; ...@@ -23,6 +23,7 @@ import java.util.concurrent.ThreadLocalRandom;
* 刚开始使用时一般为 18 位,但时间距离起始时间超过一定值后,会变为 19 位。 * 刚开始使用时一般为 18 位,但时间距离起始时间超过一定值后,会变为 19 位。
* <p> * <p>
* 消耗完 18 位所需的时间:1 * 10^18 / (3600 * 24 * 365 * 1000 * 2^22) ≈ 7.56 年。 * 消耗完 18 位所需的时间:1 * 10^18 / (3600 * 24 * 365 * 1000 * 2^22) ≈ 7.56 年。
* 消耗完 19 位所需的时间:1 * 10^19 / (3600 * 24 * 365 * 1000 * 2^22) ≈ 75.6 年。
* <p> * <p>
* 所以从 2015-01-01 起,大概在 2022-07-22,即时间差超过 7.56 年,就会达到 19 位。 * 所以从 2015-01-01 起,大概在 2022-07-22,即时间差超过 7.56 年,就会达到 19 位。
*/ */
......
...@@ -22,33 +22,47 @@ public class RedisLockUtils { ...@@ -22,33 +22,47 @@ public class RedisLockUtils {
private static final String APPLICATION_NAME = ApplicationName.get(); private static final String APPLICATION_NAME = ApplicationName.get();
private static final Duration DEFAULT_WAIT_TIME = Duration.ofSeconds(3);
/**
* if -1, then lock will be renew automatically by watchdog thread
*/
private static final Duration DEFAULT_LEASE_TIME = Duration.ofSeconds(-1);
private static RedissonClient CLIENT; private static RedissonClient CLIENT;
public static void executeWithLock(String lockName, Runnable action) { public static void executeWithLock(String lockName, Runnable action) {
executeWithLock(lockName, Duration.ofSeconds(3), action); executeWithLock(lockName, DEFAULT_WAIT_TIME, action);
}
public static void executeWithLock(String lockName, Duration waitTime, Runnable action) {
executeWithLock(lockName, waitTime, DEFAULT_LEASE_TIME, action);
} }
public static void executeWithLock(String lockName, Duration timeout, Runnable action) { public static void executeWithLock(String lockName, Duration waitTime, Duration leaseTime, Runnable action) {
executeWithLock(lockName, timeout, () -> { executeWithLock(lockName, waitTime, leaseTime, () -> {
action.run(); action.run();
return null; return null;
}); });
} }
public static <T> T executeWithLock(String lockName, Callable<T> action) { public static <T> T executeWithLock(String lockName, Callable<T> action) {
return executeWithLock(lockName, Duration.ofSeconds(3), action); return executeWithLock(lockName, DEFAULT_WAIT_TIME, action);
}
public static <T> T executeWithLock(String lockName, Duration waitTime, Callable<T> action) {
return executeWithLock(lockName, waitTime, DEFAULT_LEASE_TIME, action);
} }
public static <T> T executeWithLock(String lockName, Duration timeout, Callable<T> action) { public static <T> T executeWithLock(String lockName, Duration waitTime, Duration leaseTime, Callable<T> action) {
RLock lock = getClient().getLock(withPrefix(lockName)); RLock lock = getClient().getLock(withPrefix(lockName));
boolean locked; boolean locked;
try { try {
locked = lock.tryLock(timeout.toMillis(), TimeUnit.MILLISECONDS); locked = lock.tryLock(waitTime.toMillis(), leaseTime.toMillis(), TimeUnit.MILLISECONDS);
} catch (InterruptedException e) { } catch (InterruptedException e) {
throw new BaseException("Lock thread has been interrupted", e); throw new BaseException("Lock thread has been interrupted", e);
} }
if (!locked) { if (!locked) {
throw new BaseException(String.format("Lock cannot be acquired within %d seconds", timeout.toSeconds())); throw new BaseException(String.format("Lock cannot be acquired within %d mills", waitTime.toMillis()));
} }
try { try {
...@@ -77,4 +91,4 @@ public class RedisLockUtils { ...@@ -77,4 +91,4 @@ public class RedisLockUtils {
return String.join(StrPool.COLON, APPLICATION_NAME, "lock", lockName); return String.join(StrPool.COLON, APPLICATION_NAME, "lock", lockName);
} }
} }
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment