请用 java代码实现一个基于redis的分布式锁
时间: 2023-03-13 07:18:46 浏览: 248
我推荐使用 Jedis,它是 Java 的 Redis 客户端,可以使用它来实现基于 Redis 的分布式锁。示例代码如下: Jedis jedis = new Jedis("localhost");
String lockKey = "lockKey";
String requestId = UUID.randomUUID().toString();// 如果锁被占用,则获取失败,否则返回 OK
String result = jedis.set(lockKey, requestId, "NX", "PX", 1000);if ("OK".equals(result)) {
// 获取分布式锁成功
// 执行业务代码
} else {
// 获取分布式锁失败
}
相关问题
java代码实现redis分布式锁
好的,关于实现redis分布式锁的java代码,你可以参考以下代码:
```java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.params.SetParams;
public class RedisDistributedLock {
private JedisPool jedisPool;
// 锁定一个资源
public boolean lock(String resource, String requestId, int expireTime) {
try (Jedis jedis = jedisPool.getResource()) {
SetParams params = new SetParams().nx().ex(expireTime);
String result = jedis.set(resource, requestId, params);
return result != null && result.equalsIgnoreCase("OK");
}
}
// 释放一个资源
public void unlock(String resource, String requestId) {
try (Jedis jedis = jedisPool.getResource()) {
String value = jedis.get(resource);
if (value != null && value.equalsIgnoreCase(requestId)) {
jedis.del(resource);
}
}
}
}
```
需要注意的是,这个代码中的分布式锁是基于redis的set指令,利用了redis的原子性操作实现的。其中,nx表示只有在key不存在时才能set,ex表示key的过期时间。同时,为了保证线程安全,这里使用了JedisPool来获取Jedis实例。
redis分布式锁,java代码实现
Redis分布式锁是一种基于Redis实现的分布式锁机制,它主要通过Redis的原子性操作和高性能实现了分布式锁的功能。Redis分布式锁有两种实现方式:SETNX+EXPIRE和RedLock。其中,SETNX+EXPIRE是最简单、最常用的实现方式。
以下是Java代码实现SETNX+EXPIRE方式的Redis分布式锁:
```
public class RedisDistributedLock {
private final JedisPool jedisPool;
public RedisDistributedLock(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
public boolean lock(String key, String value, int expireTime) {
Jedis jedis = jedisPool.getResource();
try {
// SETNX命令,如果key不存在则设置key的值为value,返回1,否则返回0
Long result = jedis.setnx(key, value);
if (result == 1) {
// EXPIRE命令,设置key的过期时间
jedis.expire(key, expireTime);
return true;
}
} finally {
jedis.close();
}
return false;
}
public boolean unlock(String key, String value) {
Jedis jedis = jedisPool.getResource();
try {
// Lua脚本,保证原子性操作
String script = "if redis.call('get', KEYS) == ARGV then " +
"return redis.call('del', KEYS) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(key), Collections.singletonList(value));
if (Long.valueOf(1).equals(result)) {
return true;
}
} finally {
jedis.close();
}
return false;
}
}
```
阅读全文