redis鎖機制原理 Redis分布式鎖的原理是什么?如何續(xù)期?
Redis分布式鎖的原理是什么?如何續(xù)期?分布式鎖的需求伴隨著應(yīng)用的分布式部署。在單個應(yīng)用程序只部署一臺服務(wù)器的情況下,可以通過Java同步鎖來實現(xiàn)。同步鎖是一種原子操作。當(dāng)應(yīng)用程序以分布式方式部署并
Redis分布式鎖的原理是什么?如何續(xù)期?
分布式鎖的需求伴隨著應(yīng)用的分布式部署。在單個應(yīng)用程序只部署一臺服務(wù)器的情況下,可以通過Java同步鎖來實現(xiàn)。同步鎖是一種原子操作。
當(dāng)應(yīng)用程序以分布式方式部署并且具有多個服務(wù)時,應(yīng)用服務(wù)器將無法提供原子操作。Redis具有高性能,而且是單線程的,因此它可以為原子操作提供一個場所。有了它,就可以實現(xiàn)分布式鎖。
怎么實現(xiàn)redis的讀鎖?
避免落入setnx(set if not exists)陷阱的最好方法是永遠(yuǎn)不要使用它:
setnx lock“l(fā)ock”
expire lock 100
del lock
場景:查詢數(shù)據(jù)庫的接口有大量調(diào)用,因此添加了緩存,問題是當(dāng)并發(fā)量大的時候,如果沒有鎖機制,大量的并發(fā)請求會在緩存過期的時候穿透緩存,直接查詢數(shù)據(jù)庫,造成雪崩效應(yīng),如果有鎖機制,只能處理一個請求控制以更新緩存。其他請求根據(jù)情況等待或使用過期的緩存。
$key=“cache update Lock”//Lock
$random=MD5(uniqid(getmypid())?!啊?mturand().“”,true))//隨機值
$TTL=10//NX不存在,ex為過期時間,TTL為生存時間,單位為秒
if($redis->set($key,$random,[“NX”,“ex”=>$TTL]){
$cache->update()//鎖定后執(zhí)行業(yè)務(wù)邏輯,這里是update cache
//添加隨機值判斷為避免刪除其他操作的鎖
如果($redis->get($key)==$random){
$redis->del($key)
}
redis的高可用性主要包括主從模式、哨兵模式和集群模式。這些模式的具體實現(xiàn)原則和演進思路可以參考:[redis高可用架構(gòu)演進-今日頭條]https://m.toutiao.com/is/eejkhKG/
redis高可用實現(xiàn)原理?
1. 不能重新進入
2如果沒有本地鎖,并發(fā)性能會很差。它不用于并發(fā)鎖爭用較多的場景。本地鎖沒有自旋
3。不考慮鎖等待排序。redis很難實現(xiàn),可以通過redis的列表實現(xiàn),但是列表下的每個子節(jié)點都沒有超時。Redis也不能執(zhí)行模糊查詢key*
所以最好通過zookeeper來實現(xiàn)當(dāng)我們遇到性能瓶頸時,我們的離線節(jié)點往往無法注冊
zookeeper原理是一個臨時節(jié)點