redis分布式鎖
直接上**,我寫了四個redis分布式鎖的方法,大家可以提個意見:
第一種方法:
/**
* redis分布式鎖
* @param timeout
*/ public void lock(long timeout)
thread.sleep(100);
} } catch (exception e)
}
@override
public void lock()
public void lock(string key)
@override
public void unlock()
}public void unlock(string key)
第二種方法:
/**
* 新增分布式鎖
* @param lock
* @return
*/ public boolean acquirelock(string lock) else else
}//未超時,則直接返回失敗
else
}} catch (exception e) finally
return success;
}//釋放鎖
public void releaselock(string lock)
} catch (exception e) finally
}第三種方法:
public boolean acquire(string lockkey)
string currentvaluestr = jedis.get(lockkey); //redis裡的時間
if (currentvaluestr != null && long.parselong(currentvaluestr) < system.currenttimemillis())
}timeout -= 100;
thread.sleep(100);
}} catch (numberformatexception e) catch (interruptedexception e) finally
return false;
}//釋放鎖
public void release(string lockkey) catch (exception e) finally
}第四種方法:
/**
* 新增鎖
* @param key
* @return
*/ public boolean locked(string key) else
if (timeout == 0)
thread.sleep(100);
} while ((system.nanotime() - nano) < time_out*1000000);
return boolean.false;
} catch (jedisconnectionexception je) catch (exception e) finally
return boolean.false;
}
/**
* 釋放鎖
* @param key
*/public void unlocked(string key)
/** * 批量釋放鎖
* @param lockeys
*/public void unlocked(listlockeys) catch (jedisconnectionexception je) catch (exception e) finally
}/**
* 批量新增鎖
* @param keys
* @return
*/public boolean locked(listkeys)
system.out.println("lock keys: " + needlocking);
// 提交redis執行計數
listresults = pipeline.syncandreturnall();
for (int i = 0; i < results.size(); ++i)
}needlocking.removeall(locked); // 已鎖定資源去除
if (collectionutils.isempty(needlocking)) else
if (timeout == 0)
thread.sleep(500);
} while ((system.nanotime() - nano) < time_out*1000000);
// 得不到鎖,釋放鎖定的部分物件,並返回失敗
if (!collectionutils.isempty(locked))
return false;
} catch (jedisconnectionexception je) catch (exception e) finally
return true;
}
Redis分布式鎖
分布式鎖一般有三種實現方式 1.資料庫樂觀鎖 2.基於redis的分布式鎖 3.基於zookeeper的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...
redis分布式鎖
使用redis的setnx命令實現分布式鎖 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多個客戶端對redis的連線並不存在競爭關係。redis的setnx命令可以方便的實現分布式鎖。setnx key value 將key的值設為value,當且僅當key不存在。如給定的...
Redis分布式鎖
原文 翻譯 快取主要目的是加快查詢的速度,最好不要頻繁的改動。但現在有個需求,每個店鋪的訪問量,這個數值,是頻繁變動的,也放到redis中了。而且用分布式部署。對這個數值的操作是讀出來,加一,再寫回去。這三步應該是原子操作,不應該多個執行緒交叉進行,否則會出現錯誤。如果沒有分布式,只在乙個機器上執行...