- 使用redis的SETNX命令实现分布式锁
Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多个客户端对Redis的连接并不存在竞争关系。redis的SETNX命令可以方便的实现分布式锁。
SETNX key value
将key的值设为value,当且仅当key不存在。如给定的key已经存在,则SETNX不做任何动作。
SETNX 是set if not exists的简写。设置成功,返回1 ,否则返回0 。
- 死锁问题:给对应的key值增加expire 过期时间设置
代码实现:
public
class
RequestLockDaoRedisImpl
{
@Autowired
private
IRedisClient
redisClient
;
private
String getLockKey(
long
userId) {
return
"LOCK:"
+ userId
;
}
@Override
public
boolean
acquireUserLock(
long
per_userId,
int
expireSeconds) {
try
{
String key = getLockKey(per_userId);
if
(
redisClient
.setnx(key, System.currentTimeMillis() +
""
) == 1) {
redisClient
.expire(key, expireSeconds);
return
true
;
}
}
catch
(Exception e) {
logger
.error(
"redis Exception!!!"
);
}
return
false
;
}
@Override
public
void
delUserLock(
long
per_userId) {
String key = getLockKey(per_userId);
redisClient
.del(key);
}
}