PHP使用redis實(shí)現(xiàn)自旋鎖 分布式鎖用zookeeper還是redis好?
分布式鎖用zookeeper還是redis好?1. 無(wú)法重新進(jìn)入2。沒(méi)有本地鎖,并發(fā)性能會(huì)很差。它不用于并發(fā)鎖爭(zhēng)用較多的場(chǎng)景。本地鎖沒(méi)有自旋3。不考慮鎖等待排序。redis很難實(shí)現(xiàn),可以通過(guò)redis
分布式鎖用zookeeper還是redis好?
1. 無(wú)法重新進(jìn)入
2。沒(méi)有本地鎖,并發(fā)性能會(huì)很差。它不用于并發(fā)鎖爭(zhēng)用較多的場(chǎng)景。本地鎖沒(méi)有自旋
3。不考慮鎖等待排序。redis很難實(shí)現(xiàn),可以通過(guò)redis的列表實(shí)現(xiàn),但是列表下的每個(gè)子節(jié)點(diǎn)都沒(méi)有超時(shí)。Redis也不能執(zhí)行模糊查詢鍵*
所以當(dāng)我們遇到性能瓶頸時(shí),最好通過(guò)zookeeper來(lái)實(shí)現(xiàn),我們離線的常常無(wú)法注冊(cè)
zookeeper原則是臨時(shí)節(jié)點(diǎn)
自旋鎖)
自旋鎖有點(diǎn)像互斥鎖,但自旋鎖不會(huì)導(dǎo)致呼叫者睡眠。如果一個(gè)自旋鎖被另一個(gè)執(zhí)行單元持有,調(diào)用者總是在那里循環(huán),看它是否被持有
自旋鎖的持有者是否已經(jīng)釋放了鎖,因此得名“自旋”。它的功能是解決資源的互斥使用問(wèn)題。由于自旋鎖不會(huì)導(dǎo)致調(diào)用者睡眠,所以自旋鎖的效率比互斥鎖高很多。雖然它的效率高于互斥鎖,但它也有一些缺點(diǎn):1。自旋鎖總是占用CPU。它運(yùn)行所有的時(shí)間-自旋沒(méi)有得到鎖,所以它占用CPU。如果不能在短時(shí)間內(nèi)獲得鎖,無(wú)疑會(huì)降低CPU效率。
2. 使用自旋鎖時(shí),可能會(huì)導(dǎo)致死鎖。遞歸調(diào)用時(shí),可能導(dǎo)致死鎖。調(diào)用其他一些函數(shù)也可能導(dǎo)致死鎖,例如copyuutouuser()、copyufromuuser()、kmalloc()等,因此使用自旋鎖要謹(jǐn)慎。只有當(dāng)內(nèi)核是搶占式或SMP時(shí),才真正需要自旋鎖。在單CPU非搶占式內(nèi)核中,自旋鎖的操作為空。旋轉(zhuǎn)鎖適用于鎖用戶在短時(shí)間內(nèi)保持鎖。
互斥:線程將切換上下文,搶占CPU并將信號(hào)從休眠發(fā)送到運(yùn)行。
自旋鎖:線程總是在運(yùn)行(lock> unlock),死循環(huán)檢測(cè)鎖標(biāo)志位,機(jī)制并不復(fù)雜。
互斥鎖是一種睡眠等待鎖。例如,在雙核機(jī)器上,有兩個(gè)線程(線程a和線程b),分別在core0和
core1上運(yùn)行。假設(shè)線程a希望通過(guò)pthreadmutexLock操作來(lái)獲得關(guān)鍵區(qū)域的鎖。此時(shí),鎖由線程B持有,那么線程a將被阻塞
這是毫無(wú)疑問(wèn)的,因?yàn)榫€程鎖定是資源密集型的
!那么,如何避免鎖的性能下降呢?
1、從業(yè)務(wù)上避免大量鎖結(jié)構(gòu)
!2. 使用ThreadLocal,可以保證每個(gè)線程中的數(shù)據(jù)不會(huì)互相污染
!3. 如果讀多寫(xiě)少,請(qǐng)使用讀寫(xiě)鎖
!4. 自旋鎖將挑戰(zhàn)CPU,盡管它是一個(gè)線程時(shí)間很少的鎖
!5. 鎖的粒度應(yīng)該盡可能小:可以在方法中的鎖不應(yīng)該占用整個(gè)方法