分布式锁和代码实现
【摘要】 分布式锁介绍在单体应用中,为了保证数据的一致性和线程安全,我们可以使用 Java 内置的锁机制,如 synchronized 关键字和 ReentrantLock 类。然而,在分布式系统中,多个服务实例可能同时访问共享资源,传统的单体锁机制无法满足需求,这时就需要使用分布式锁。分布式锁是一种用于在分布式系统中控制对共享资源访问的机制,它可以确保在同一时刻只有一个客户端能够获取到锁并执行关键代...
分布式锁介绍
各种实现方式的优缺点
import redis.clients.jedis.Jedis;
import java.util.Collections;
public class RedisDistributedLock {
private static final String LOCK_SUCCESS = "OK";
private static final String SET_IF_NOT_EXIST = "NX";
private static final String SET_WITH_EXPIRE_TIME = "PX";
private static final Long RELEASE_SUCCESS = 1L;
private Jedis jedis;
public RedisDistributedLock(Jedis jedis) {
this.jedis = jedis;
}
/**
* 尝试获取分布式锁
* @param lockKey 锁的键
* @param requestId 请求标识,用于区分不同的客户端请求
* @param expireTime 锁的过期时间,单位为毫秒
* @return 是否获取锁成功
*/
public boolean tryLock(String lockKey, String requestId, int expireTime) {
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
return LOCK_SUCCESS.equals(result);
}
/**
* 释放分布式锁
* @param lockKey 锁的键
* @param requestId 请求标识,用于区分不同的客户端请求
* @return 是否释放锁成功
*/
public boolean releaseLock(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(lockKey), Collections.singletonList(requestId));
return RELEASE_SUCCESS.equals(result);
}
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
RedisDistributedLock lock = new RedisDistributedLock(jedis);
String lockKey = "myLock";
String requestId = "123456";
int expireTime = 10000;
// 尝试获取锁
if (lock.tryLock(lockKey, requestId, expireTime)) {
try {
// 模拟业务逻辑
System.out.println("获取锁成功,开始执行业务逻辑...");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 释放锁
lock.releaseLock(lockKey, requestId);
System.out.println("业务逻辑执行完毕,释放锁...");
}
} else {
System.out.println("获取锁失败,请稍后重试。");
}
jedis.close();
}
}
代码解释
注意事项
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)