在分布式系统中,如何安全地控制共享资源的访问是一个经典难题。Redis 凭借其高性能和单线程特性,常被用作分布式锁的实现基础。下面展示一个基于 Jedis 的 Java 实现示例,重点在于处理加锁与解锁时的原子性问题。
import redis.clients.jedis.JedisPool;
import java.util.Collections;
public class RedisLock {
private static final String LOCK_SUCCESS = "OK";
private static final String SET_IF_NOT_EXIST = "NX";
private static final String SET_WITH_EXPIRE_TIME = "PX";
private static final Long RELEASE_SUCCESS = 1L;
private JedisPool pool;
public RedisLock(JedisPool pool) {
this.pool = pool;
}
/**
* 尝试获取分布式锁
* @param lockKey 锁标识,例如 user_id
* @param requestId 请求唯一标识,例如 uuid
* @param expireTime 超时时间(毫秒)
* @return 是否获取成功
*/
public boolean tryDistributedLock(String lockKey, String requestId, expireTime) {
pool.getResource().set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
(LOCK_SUCCESS.equals(result)) {
;
}
;
}
{
;
pool.getResource().eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
(RELEASE_SUCCESS.equals(result)) {
;
}
;
}
}


