PHP使用Redis實(shí)現(xiàn)防止大并發(fā)下二次寫(xiě)入的方法
本文實(shí)例講述了PHP使用Redis實(shí)現(xiàn)防止大并發(fā)下二次寫(xiě)入的方法。分享給大家供大家參考,具體如下:
PHP調(diào)用redis進(jìn)行讀寫(xiě)操作,大并發(fā)下會(huì)出現(xiàn):讀取key1,沒(méi)有內(nèi)容則寫(xiě)入內(nèi)容,但是大并發(fā)下會(huì)出現(xiàn)同時(shí)多個(gè)php進(jìn)程寫(xiě)入的情況,這個(gè)時(shí)候需要加一個(gè)鎖,即獲取鎖的php進(jìn)程有權(quán)限寫(xiě)。
$lock_key = 'LOCK_PREFIX' . $redis_key; $is_lock = $redis->setnx($lock_key, 1); // 加鎖 if($is_lock == true){ // 獲取鎖權(quán)限 $redis->setex($redis_key, $expire, $data); // 寫(xiě)入內(nèi)容 // 釋放鎖 $redis->del($lock_key); }else{ return true; // 獲取不到鎖權(quán)限,直接返回 }
思路是:設(shè)置一個(gè)鎖的key,setnx是原子操作,只能一個(gè)進(jìn)程寫(xiě)入成功,寫(xiě)入成功返回true(表示獲取鎖權(quán)限),然后寫(xiě)入內(nèi)容再釋放鎖即刪除鎖key。獲取不到鎖的進(jìn)程直接返回。但是這里有種情況,獲取鎖權(quán)限的進(jìn)程,獲取鎖后運(yùn)行報(bào)錯(cuò)了,導(dǎo)致沒(méi)有釋放鎖,那么一直就不能寫(xiě)入內(nèi)容,這時(shí)就需要拿不到鎖權(quán)限的進(jìn)程去判斷鎖的剩余有效時(shí)間,如果為-1則設(shè)置鎖的有效時(shí)間為5秒(預(yù)留5秒給拿到鎖的進(jìn)程的運(yùn)行時(shí)間,足夠多了)。改良后的代碼:
$lock_key = 'LOCK_PREFIX' . $redis_key; $is_lock = $redis->setnx($lock_key, 1); // 加鎖 if($is_lock == true){ // 獲取鎖權(quán)限 $redis->setex($redis_key, $expire, $data); // 寫(xiě)入內(nèi)容 // 釋放鎖 $redis->del($lock_key); }else{ // 防止死鎖 if($redis->ttl($lock_key) == -1){ $redis->expire($lock_key, 5); } return true; // 獲取不到鎖權(quán)限,直接返回 }
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《php+redis數(shù)據(jù)庫(kù)程序設(shè)計(jì)技巧總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《PHP基本語(yǔ)法入門(mén)教程》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
- PHP并發(fā)場(chǎng)景的三種解決方案代碼實(shí)例
- php并發(fā)加鎖問(wèn)題分析與設(shè)計(jì)代碼實(shí)例講解
- PHP解決高并發(fā)的優(yōu)化方案實(shí)例
- php多進(jìn)程模擬并發(fā)事務(wù)產(chǎn)生的問(wèn)題小結(jié)
- PHP利用Mysql鎖解決高并發(fā)的方法
- php curl批處理實(shí)現(xiàn)可控并發(fā)異步操作示例
- php處理?yè)屬?gòu)類(lèi)功能的高并發(fā)請(qǐng)求
- PHP+Redis 消息隊(duì)列 實(shí)現(xiàn)高并發(fā)下注冊(cè)人數(shù)統(tǒng)計(jì)的實(shí)例
- PHP開(kāi)發(fā)中解決并發(fā)問(wèn)題的幾種實(shí)現(xiàn)方法分析
- php結(jié)合redis高并發(fā)下發(fā)帖、發(fā)微博的實(shí)現(xiàn)方法
- 詳解php處理大并發(fā)大流量大存儲(chǔ)
相關(guān)文章
用php代碼限制國(guó)內(nèi)IP訪問(wèn)我們網(wǎng)站
這篇文章主要介紹了用php代碼限制國(guó)內(nèi)IP訪問(wèn)我們網(wǎng)站,需要的朋友可以參考下2015-09-09php selectradio和checkbox默認(rèn)選擇的實(shí)現(xiàn)方法詳解
本篇文章是對(duì)php selectradio和checkbox默認(rèn)選擇的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP安全之register_globals的on和off的區(qū)別
這篇文章主要介紹了PHP安全之register_globals的on和off的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07php設(shè)計(jì)模式 Bridge (橋接模式)
將抽象部份與它實(shí)現(xiàn)部分分離,使用它們都可以有獨(dú)立的變化2011-06-06php設(shè)計(jì)模式 Template (模板模式)
定義一個(gè)操作中的算法骨架,而將一些步驟延遲到子類(lèi)中,使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)可以定義該算法的某些特定步驟2011-06-06