以下是使用 Redis 实现并发锁的 Java 示例代码:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;
public class RedisLock {
private Jedis jedis;
private String lockKey;
private int expireTime = 30; // 锁过期时间,默认为30秒
private boolean locked = false;
public RedisLock(Jedis jedis, String lockKey) {
this.jedis = jedis;
this.lockKey = lockKey;
}
public RedisLock(Jedis jedis, String lockKey, int expireTime) {
this.jedis = jedis;
this.lockKey = lockKey;
this.expireTime = expireTime;
}
public boolean acquire() {
long nowTime = System.currentTimeMillis();
long expireTime = nowTime + this.expireTime * 1000 + 1;
String expireTimeStr = String.valueOf(expireTime);
SetParams params = new SetParams();
params.nx().px(this.expireTime * 1000);
String result = jedis.set(lockKey, expireTimeStr, params);
if ("OK".equals(result)) {
locked = true;
return true;
} else {
return false;
}
}
public void release() {
if (locked) {
jedis.del(lockKey);
locked = false;
}
}
}
使用示例:
Jedis jedis = new Jedis("localhost", 6379);
RedisLock lock = new RedisLock(jedis, "mylock");
try {
if (lock.acquire()) {
// 获得锁成功,执行业务逻辑
}
} finally {
lock.release();
}
在上面的示例中,我们定义了一个 RedisLock
类,它包含了 Redis 连接、锁的键名、锁的过期时间和一个标志位 locked
。其中 acquire()
方法用于获取锁,如果成功则返回 true;release()
方法用于释放锁。
在 acquire()
方法中,我们首先获取当前时间戳和锁的过期时间,然后使用 SETNX
命令尝试获取锁,同时设定锁的过期时间。如果返回值是 “OK”,说明获取锁成功;否则说明锁已经被其他进程占用,获取锁失败。
在 release()
方法中,我们只需要使用 DEL
命令删除锁的键即可。注意要判断 locked
标志位是否为true,以避免重复释放锁。
以上示例代码只是一个简单的实现,还有很多细节需要注意,比如加锁和释放锁的顺序、锁的粒度等问题,需要根据具体业务场景进行调整。