java 如何给Redis枷锁
时间: 2024-02-20 15:19:42 浏览: 83
在 Java 中使用 Redis 实现分布式锁可以使用 Redis 的 SETNX(set if not exists)命令。以下是一个简单的示例代码:
```java
import redis.clients.jedis.Jedis;
public class RedisLock {
private static final String LOCK_KEY = "mylock";
private static final int EXPIRE_TIME = 5000; // 锁的过期时间,单位毫秒
private Jedis jedis;
public RedisLock(Jedis jedis) {
this.jedis = jedis;
}
public boolean acquireLock() {
long startTime = System.currentTimeMillis();
while (true) {
// 尝试获取锁
String result = jedis.set(LOCK_KEY, "locked", "NX", "PX", EXPIRE_TIME);
if ("OK".equals(result)) {
return true; // 获取到锁
}
// 判断是否超过获取锁的最大等待时间
long currentTime = System.currentTimeMillis();
if (currentTime - startTime > EXPIRE_TIME) {
return false; // 获取锁超时
}
try {
Thread.sleep(100); // 等待一段时间后重试
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
public void releaseLock() {
jedis.del(LOCK_KEY); // 释放锁
}
}
```
使用示例:
```java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class Main {
public static void main(String[] args) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(100); // 设置最大连接数
JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
Jedis jedis = jedisPool.getResource();
RedisLock redisLock = new RedisLock(jedis);
// 获取锁
if (redisLock.acquireLock()) {
try {
// 执行业务逻辑
System.out.println("执行业务逻辑...");
} finally {
// 释放锁
redisLock.releaseLock();
}
} else {
// 获取锁失败
System.out.println("获取锁失败...");
}
jedis.close();
jedisPool.close();
}
}
```
这是一个简单的 Redis 分布式锁实现,通过 SETNX 命令尝试将一个带有过期时间的键设置为锁标志。如果 SETNX 返回 OK,则表示获得了锁;如果返回 null,则表示锁已经被其他线程或进程持有,此时可以通过轮询等待再次尝试获取锁。在业务逻辑执行完成后,调用 releaseLock() 方法来释放锁。
阅读全文