redis 分布式锁 另一种实现
/**
* deadLine 失效时间,比如当前时间+10s
*/
public boolean lock(String lock,long deadLine) {
Boolean key = false;
try {
key = jimClient.setNX(lock, String.valueOf(deadLine));
if(!key){
String preValue = jimClient.get(lock);
if(preValue!=null){
long preDeadLine = Long.parseLong(preValue);
//如果当前时间大于上次的设置的失效时间,则上次的没有释放,或者上次的机器宕机,所有机器重新获取锁,getset的作用突显出来
if (preDeadLine < System.currentTimeMillis()){
String oldKey = jimClient.getSet(lock, String.valueOf(deadLine));
if(oldKey!=null && Long.parseLong(oldKey) == preDeadLine) {
key = true;
}else{
jimClient.set(lock,oldKey);
}
}
}
}
}catch (Exception e){
e.printStackTrace();
}
return key;
}
public void release(String lock,long deadLine){
try {
if(StringUtils.isNotBlank(jimClient.get(lock)) && Long.parseLong(jimClient.get(lock)) == deadLine){
jimClient.del(lock);
}
}catch (Exception e){
e.printStackTrace();
}
}
下一篇:
谷粒学苑第二章前端框架-2.1登录功能
