一、代码示例:
import redis.clients.jedis.Jedis;
import java.util.Collections;
public class RedisDistributedLock {
private static final String LOCK_PREFIX = "distributed_lock:";
private Jedis jedis;
public RedisDistributedLock(Jedis jedis) {
this.jedis = jedis;
}
/**
* 加锁
*
* @param lockKey 锁的key
* @param requestId 请求标识,用于解锁
* @param expireTime 过期时间,单位ms
* @return 是否加锁成功
*/
public boolean lock(String lockKey, String requestId, int expireTime) {
long result = jedis.setnx(LOCK_PREFIX + lockKey, requestId);
System.out.println(result);
if (result == 1) {
System.out.println("获取锁成功,设置过期时间:" + expireTime);
// 获取锁成功,设置过期时间
jedis.expire(LOCK_PREFIX + lockKey, expireTime);
return true;
} else {
// 获取锁失败
return false;
}
}
/**
* 解锁
*
* @param lockKey 锁的key
* @param requestId 请求标识
* @return 是否释放锁成功
*/
public boolean unlock(String lockKey, String requestId) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(LOCK_PREFIX + lockKey), Collections.singletonList(requestId));
return "1".equals(result.toString());
}
}
import redis.clients.jedis.Jedis;
public class Main {
public static void main(String[] args) {
// 创建Jedis连接
Jedis jedis = new Jedis("localhost", 6379);
jedis.auth("redis");
// 加锁
String lockKey = "test_lock";
String requestId = "my_request";
int expireTime = 5000; // 5秒过期
RedisDistributedLock redisLock = new RedisDistributedLock(jedis);
boolean locked = redisLock.lock(lockKey, requestId, expireTime);
if (locked) {
System.out.println("获取分布式锁成功!");
} else {
System.out.println("获取分布式锁失败!");
}
// 执行业务逻辑
doBusiness();
// 解锁
boolean unlocked = redisLock.unlock(lockKey, requestId);
if (unlocked) {
System.out.println("释放分布式锁成功!");
} else {
System.out.println("释放分布式锁失败!");
}
// 关闭Jedis连接
jedis.close();
}
private static void doBusiness() {
// 此处为业务逻辑,可以随意替换成其他操作
try {
Thread.sleep(3000); // 模拟业务处理时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.4.0</version>
</dependency>
<!-- var code = "5d0a7703-af7b-4b4b-bcda-7d792bf86983" -->