Redis实现分布式锁:setnx
Redis实现分布式锁:setnx
·
1、概述
分布式锁:控制分布式系统有序的去对共享资源进行操作,通过互斥来保证数据的一致性。
解决方案:
我这里就只介绍Redis的分布式锁的用法。
2、Redis分布式锁
sexnx (SET if Not Exists) 命令在指定的 key 不存在时,为 key 设置指定的值。
这种加锁的思路是,如果 key 不存在则为 key 设置 value,如果 key 已存在则 SETNX 命令不做任何操作。
- 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功
- 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败
- 客户端A执行代码完成,删除锁
- 客户端B在等待一段时间后再去请求设置key的值,设置成功
- 客户端B执行代码完成,删除锁
代码实现:
// name:key的名称,不同业务用不同的key;
// expire :过期时间,避免出现死锁
// 返回TRUE,则是获取锁成功;FALSE,则是获取失败
public Boolean tryLock(String name, long expire) {
name = name + "_lock";
String value = UUID.randomUUID().toString(); // 随机生成一个UUID作为value
RedisConnectionFactory factory = stringRedisTemplate.getConnectionFactory();
RedisConnection conn = factory.getConnection();
try {
//参考redis命令:
//set key value [EX seconds] [PX milliseconds] [NX|XX]
Boolean result = conn.set(
name.getBytes(),
value.getBytes(),
Expiration.from(expire, TimeUnit.MILLISECONDS),
RedisStringCommands.SetOption.SET_IF_ABSENT);
if (result != null && result)
return true;
} finally {
RedisConnectionUtils.releaseConnection(conn, factory,false);
}
return false;
}
更多推荐
已为社区贡献7条内容
所有评论(0)