redis鎖處理并發(fā) 怎么實(shí)現(xiàn)redis的讀鎖?
怎么實(shí)現(xiàn)redis的讀鎖?避免落入setnx(set if not exists)陷阱的最好方法是永遠(yuǎn)不要使用它:setnx lock“l(fā)ock”expire lock 100del lock場景:查
怎么實(shí)現(xiàn)redis的讀鎖?
避免落入setnx(set if not exists)陷阱的最好方法是永遠(yuǎn)不要使用它:
setnx lock“l(fā)ock”
expire lock 100
del lock
場景:查詢數(shù)據(jù)庫的接口有大量調(diào)用,因此添加了緩存,緩存設(shè)置為過期后刷新。
問題是當(dāng)并發(fā)性大,如果沒有鎖機(jī)制,大量的并發(fā)請求會在緩存過期時(shí)穿透緩存直接查詢數(shù)據(jù)庫,造成雪崩效應(yīng)如果有鎖機(jī)制,只能控制一個(gè)請求更新緩存。其他請求根據(jù)情況等待或使用過期的緩存。
$key=“cache update Lock”//Lock
$random=MD5(uniqid(getmypid())?!啊?mturand().“”,true))//隨機(jī)值
$TTL=10//NX不存在,ex為過期時(shí)間,TTL為生存時(shí)間,單位為秒
if($redis->set($key,$random,[“NX”,“ex”=>$TTL]){
$cache->update()//鎖定后執(zhí)行業(yè)務(wù)邏輯,這里是update cache
//添加隨機(jī)值判斷為避免刪除其他操作的鎖
如果($redis->get($key)==$random){
$redis->del($key)
}
redis分布式鎖宕機(jī)怎么處理?
為了防止鎖因停機(jī)而被釋放,請?jiān)阪i定時(shí)設(shè)置過期時(shí)間,并確保鎖到達(dá)過期時(shí)間時(shí)自動釋放。
redis分布式鎖怎么解決02master宕機(jī)后,鎖還能正常使用?
為了使集群在某些節(jié)點(diǎn)離線或無法與集群中的大多數(shù)節(jié)點(diǎn)通信時(shí)正常工作,redis cluster對節(jié)點(diǎn)使用主從功能:集群中的每個(gè)節(jié)點(diǎn)都有一到n個(gè)復(fù)制,其中一個(gè)是主節(jié)點(diǎn),而另一個(gè)n-1個(gè)產(chǎn)品是從節(jié)點(diǎn)。