redis分布式鎖

2021-07-22 07:03:29 字數 2609 閱讀 3235

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中了。而且用分布式部署。對這個數值的操作是讀出來,加一,再寫回去。這三步應該是原子操作,不應該多個執行緒交叉進行,否則會出現錯誤。如果沒有分布式,只在乙個機器上執行...