Java 实现 Redis 分布式锁:简单易懂的代码示例
以下是一个简单的 Redis 分布式锁的 Java 实现:
import redis.clients.jedis.Jedis;
public class RedisLock {
private Jedis jedis;
private String lockKey;
private int expireTime = 30; // 锁过期时间,单位秒
private boolean locked = false;
public RedisLock(Jedis jedis, String lockKey) {
this.jedis = jedis;
this.lockKey = lockKey;
}
// 获取锁,如果获取成功返回 true,否则返回 false
public boolean lock() {
long expires = System.currentTimeMillis() + expireTime * 1000 + 1;
String expiresStr = String.valueOf(expires);
if (jedis.setnx(lockKey, expiresStr) == 1) {
locked = true;
return true;
}
String currentValueStr = jedis.get(lockKey);
if (currentValueStr != null && Long.parseLong(currentValueStr) < System.currentTimeMillis()) {
// 锁已经过期,尝试获取锁
String oldValueStr = jedis.getSet(lockKey, expiresStr);
if (oldValueStr != null && oldValueStr.equals(currentValueStr)) {
locked = true;
return true;
}
}
return false;
}
// 释放锁
public void unlock() {
if (locked) {
jedis.del(lockKey);
locked = false;
}
}
}
使用方法:
import redis.clients.jedis.Jedis;
public class TestRedisLock {
public static void main(String[] args) {
Jedis jedis = new Jedis('localhost', 6379);
RedisLock lock = new RedisLock(jedis, 'test_lock');
try {
if (lock.lock()) {
// 获取锁成功,执行业务逻辑
System.out.println('获取锁成功');
} else {
// 获取锁失败,可能有其他进程在处理
System.out.println('获取锁失败');
}
} finally {
lock.unlock(); // 释放锁
}
jedis.close();
}
}
原文地址: https://www.cveoy.top/t/topic/lSsO 著作权归作者所有。请勿转载和采集!