1,redis分布式锁 setnx方法实现原子操作,确保并发安全
setnx(key,v); //只用到key value用key值即可
不存在 返回 1
存在 返回 0
expire(key,seconds);seconds是过期时间 单位 秒
查询过期时间
ttl key
返回-1 key未设置过期时间
返回-2 key已过期
返回正数 则是过期时间 秒
2,我使用redis分布式锁的基本思路
1 任务运行 执行setnx 如返回1后,设置key过期间,(为了确保下次正常运行),然后再执行任务!
2 各个服务器时间必须一致,确保并发安全! 根据业务需要设置过期时间!
例如定时任务(设置过期的时间>大于服务器误差时间即可)
3 为什么不用del(k);? 以防删除失败!导致任务下次无法运行
示例代码
/**
* redis 实现原子操作 不存在1 存在0
*
* @param key
* @param value
* @return
*/
public static int setnx(String key,String value) {
Jedis jedis = null;
try {
jedis = ConnectionManager.getConnection();
int j=jedis.setnx(key, value).intValue();
//添加key成功 设置过期时间
if(j==1){
int seconds=59;
jedis.expire(key, seconds);
}else{
//没有设置过期时间 会返回-1 del掉
Long lt=jedis.ttl(key);
if(lt==-1){
jedis.del(key);
}
}
return j;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
ConnectionManager.closeConnection(jedis);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return 0;
}