分布式锁:控制分布式系统有序的去对共享资源进行操作,通过互斥来保证数据的一致性。
分布式锁实现方案
redis:分布式锁
借助redis实现分布式锁可使用使用SETNX命令完成
sexnx(SET if Not Exists)命令在指定的key不存在时,为key设置指定的值。不存在则设置值
如下图,当客户端A先请求服务端设置key,即加锁,key存在就说明资源被占用,此时客户端B再申请,发现key存在,将无法获得zi'yuan
代码实现
/**
* 加锁
*
* @param name
* @param expire
* @return
*/
public String tryLock(String name, long expire) {
name = name + "_lock";
String token = UUID.randomUUID().toString(); // 锁
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(),
token.getBytes(),
Expiration.from(expire, TimeUnit.MILLISECONDS), // 设置过期时间,防止产生死锁
RedisStringCommands.SetOption.SET_IF_ABSENT //NX
);
if (result != null && result)
return token;
} finally {
RedisConnectionUtils.releaseConnection(conn, factory,false);
}
return null; // 键已存在,已上锁,返回空
}