亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP和redis實現悲觀鎖機制的解析

2020-03-22 19:48:20
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP+redis實現的悲觀鎖機制,簡單介紹了redis鎖機制與樂觀鎖、悲觀鎖等概念,并結合實例形式分析了php+redis實現悲觀鎖相關操作技巧,需要的朋友可以參考下

本文實例講述了PHP+redis實現的悲觀鎖。分享給大家供大家參考,具體如下:

鎖機制

通常使用的鎖分為樂觀鎖,悲觀鎖這兩種,簡單介紹下這兩種鎖,作為本文的背景知識,對這類知識已經有足夠了解的同學可以跳過這部分。

樂觀鎖

先來看下百度百科上的解釋:大多是基于數據版本( Version )記錄機制實現。何謂數據版本?即為數據增加一個版本標識,在基于數據庫表的版本解決方案中,一般是通過為數據庫表增加一個 “version” 字段來實現。讀取出數據時,將此版本號一同讀出,之后更新時,對此版本號加一。此時,將提交數據的版本數據與數據庫表對應記錄的當前版本信息進行比對,如果提交的數據版本號大于數據庫表當前版本號,則予以更新,否則認為是過期數據。

其實說白了,就是好比一個健身房里只有一臺跑步機,在健身房門口有個排號機,每個進健身房的人都得先領一個號碼才能進入,如果跑步機上有人,則在一邊做做熱身、喝喝水,如果跑步機上沒人,則確認跑步機上當前顯示的號碼(上一個用過跑步機的人的號碼)是否比自己手持的小,如果小,則可以使用;否則,就意味著過號,而過號在現實中我們的都知道要么走,要么重排,就是不能插隊,在系統中也是一樣的,通常是返回錯誤。

悲觀鎖

同樣,來看下百度百科的解釋:具有強烈的獨占和排他特性。它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個數據處理過程中,將數據處于鎖定狀態。悲觀鎖的實現,往往依靠數據庫提供的鎖機制(也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改數據)。

然后,也同樣通俗的解釋下,還是那個健身房。這次在門口不需要排號機了,而是掛著把鑰匙(只有一把),想進去的人必須拿到這把鑰匙才行,拿到鑰匙的人可以進入,不管是熱身、喝水還是跑步都可以,直到他出來把鑰匙掛回墻上,下一個才能去爭取,拿到的才可以再進去。聽著好像有點不人性化,所以悲觀鎖比較適合強一致性的場景,但效率比較低,特別是讀的并發低。樂觀鎖則適用于讀多寫少,并發沖突少的場景。

背景

先說下,本文的開發背景,方便大家了解為什么要使用悲觀鎖以及文中鎖的詳細設計。

任務分發系統:任務池(mysql)中存在大量任務(文章),現在需要用戶協助編輯,系統基本需求如下(簡化版):

1、推送用戶感興趣的分類下的任務到用戶編輯器中;
2、用戶編輯提交一個任務后,自動推送下一個任務;
3、每次只分配一個任務給用戶;
4、如果一個用戶占有某任務超過一定時間,則自動釋放任務,任務進任務池,重新循環;
5、……

目標

目標有兩個:

1、一個任務在同一時間段內只能被一個用戶所持有;

2、避免出現死任務,即避免任務被用戶長時間占有,無法釋放。

思路

由于系統并發量較大,并且有頻繁的寫操作,所以選擇悲觀鎖來控制每個任務只能同時被一個用戶領取。主要思路如下:

1、從任務池中找出一部分可分配的任務;
2、根據一定順序,選擇一個任務,作為候選推送任務;
3、嘗試對候選推送任務加鎖;
4、如果加鎖成功,則推送任務給用戶,并修改對應的任務狀態和用戶狀態;
5、如果加鎖失敗,則任務已被領取,重復2-5,直到推送成功。

實現

這里只介紹下鎖的實現機制,其余業務邏輯略過。由于加鎖過程應該是不可拆解的,也就是常說的原子型操作,因此這里選擇redis中的setnx操作作為加鎖的方法。

簡化版的代碼如下:

function lock($strMutex, $intTimeout) { $objRedis = new Redis(); //使用setnx原子型操作加鎖 $intRet = $objRedis- setnx($strMutex, 1); if ($intRet) { //設置過期時間,防止死任務的出現 $objRedis- expire($strMutex, $intTimeout); return true; return false;}

這段代碼有個問題,就是setnx成功,但expire失敗,這就可能存在死任務的情況。解決這個問題的一種通用方法是通過使用incr方法代替setnx,具體如下:

function lock($strMutex, $intTimeout, $intMaxTimes = 0) { $objRedis = new Redis(); //使用incr原子型操作加鎖 $intRet = $objRedis- incr($strMutex); if ($intRet === 1) { //設置過期時間,防止死任務的出現 $objRedis- expire($strMutex, $intTimeout); return true; if ($intMaxTimes 0 $intRet = $intMaxTimes $objRedis- ttl($strMutex) === -1) { //當設置了最大加鎖次數時,如果嘗試加鎖次數大于最大加鎖次數并且無過期時間則強制解鎖 $objRedis- del($strMutex); return false;}

這段代碼通過$intMaxTimes來保證即使在expire未成功的時候也能強制解鎖,保證系統不會出現死任務。

還有沒有更好的方法呢?

其實redis中的set操作已兼容了setnx,并且支持設置過期時間。

function lock($strMutex, $intTimeout) { $objRedis = new Redis(); //使用setnx操作加鎖,同時設置過期時間 $strRet = $objRedis- set($strMutex, 1, ex , $intTimeout, nx  if ($strRet === OK ) { return true; return false;}

這個方法是我認為目前最好的,但是為什么沒有直接介紹這個方法,而是先介紹incr那個方法呢?其實細心的同學可以看到上面那個方面有兩個加粗的字”通用“。之所以這么說是因為set方法是從redis2.6.12版本才開始支持多參數的。

水平有限,歡迎指正~

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !

相關推薦:

php中可變函數的使用總結

非遞歸實現PHP樹的方法

利用PHP獲取用戶客戶端真實IP的方法

以上就是PHP和redis實現悲觀鎖機制的解析的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产综合香蕉五月婷在线| 日韩在线www| 日韩美女在线看| 这里只有精品视频| 亚洲视频在线视频| 国产精品v日韩精品| 国模私拍一区二区三区| 日本精品久久电影| 亚洲国产精品成人一区二区| 日韩欧美亚洲成人| 国产日韩欧美黄色| 久久精品久久久久电影| xxxxxxxxx欧美| 欧美激情视频免费观看| 日韩欧美在线观看视频| 97超级碰碰碰| 欧美成人精品三级在线观看| 亚洲精品久久久一区二区三区| 国产亚洲精品久久| 久久视频在线直播| 国产精品中文字幕在线观看| 国产成人精品午夜| 久99久在线视频| 欧美性生交xxxxx久久久| 久久精品国产亚洲精品| 亚洲精品国产欧美| 久久精品国产电影| 久久视频在线免费观看| 亚洲欧洲av一区二区| 日韩中文字幕在线精品| 91精品国产91久久久久| 国产欧美一区二区| 久久久精品国产一区二区| 精品一区二区亚洲| www国产91| 久久综合色影院| 国产亚洲欧美一区| 日韩av高清不卡| 亚洲第一av网站| 欧美黑人xxxⅹ高潮交| 欧美亚洲视频一区二区| 欧美一区二区大胆人体摄影专业网站| 国产99久久精品一区二区 夜夜躁日日躁| 国产一区二区三区在线免费观看| 亚洲一区二区久久久| 欧美成人全部免费| 久久免费少妇高潮久久精品99| 欧美日韩中文在线| 国产精品第一视频| 日韩欧美亚洲成人| 国产va免费精品高清在线| 欧美性猛交99久久久久99按摩| 热99久久精品| 国产成人a亚洲精品| 91在线精品播放| 亚洲精品在线观看www| 91在线观看免费高清| 精品国产欧美一区二区三区成人| 欧美黄色成人网| 成人国产亚洲精品a区天堂华泰| 在线看日韩av| 亚州成人av在线| 欧美亚洲视频一区二区| 68精品久久久久久欧美| 欧美亚洲成人精品| 亚洲xxxx妇黄裸体| 国产视频精品在线| 伦伦影院午夜日韩欧美限制| 欧美日韩国产成人在线观看| 亚洲欧美日韩图片| 欧美极品少妇xxxxx| 色天天综合狠狠色| 亚洲欧美制服另类日韩| 97视频色精品| 国产美女精品免费电影| 欧美日本高清视频| 91精品国产综合久久男男| 国产精品精品视频一区二区三区| 欧美日韩国产限制| 日韩av成人在线| 亚洲成**性毛茸茸| 国产乱肥老妇国产一区二| 亚洲欧洲美洲在线综合| 亚洲成人黄色网| 久久久久久久电影一区| 日韩在线观看免费| 国产视频久久网| 日韩在线小视频| 亚洲精品v天堂中文字幕| 亚洲一区免费网站| 国产精品第3页| 国产精品丝袜视频| 伊人亚洲福利一区二区三区| 国产成人福利夜色影视| 亚洲欧洲中文天堂| 神马久久桃色视频| 国产成人一区二区| 亚洲精品一区久久久久久| 午夜精品美女自拍福到在线| 欧美午夜视频一区二区| 国产精品白丝jk喷水视频一区| 久久久久日韩精品久久久男男| 在线免费观看羞羞视频一区二区| 久久夜色精品国产| 最近的2019中文字幕免费一页| 亚洲第一av网| 26uuu亚洲国产精品| 欧美放荡办公室videos4k| 久久777国产线看观看精品| 日韩网站在线观看| 欧美洲成人男女午夜视频| 91免费高清视频| 午夜精品一区二区三区在线视| 欧美日韩亚洲系列| 欧美视频在线观看 亚洲欧| 亚洲男人的天堂在线播放| 91精品国产综合久久久久久久久| 中文字幕精品www乱入免费视频| 色婷婷av一区二区三区在线观看| 国产精品美女主播| 成人97在线观看视频| 久久久精品免费视频| 国产欧美中文字幕| 中文字幕欧美专区| 欧美日韩国产中字| 久久久在线观看| 亚洲欧洲一区二区三区在线观看| 成人a免费视频| 成人黄色午夜影院| 国产精品7m视频| 久久久999精品视频| 欧美性在线视频| 91亚洲人电影| 国产欧美在线视频| 精品亚洲一区二区三区在线观看| 欧美在线一级视频| 成人免费午夜电影| 国产精品永久免费观看| 国产精品直播网红| 久久99精品久久久久久噜噜| 色悠久久久久综合先锋影音下载| 97在线视频免费看| 一区二区在线免费视频| 亚洲人成77777在线观看网| 亚洲国产成人在线视频| 超碰97人人做人人爱少妇| 国产精品欧美日韩一区二区| 色噜噜久久综合伊人一本| 91精品视频网站| 成人欧美一区二区三区黑人孕妇| 中文字幕精品久久久久| 91久久久久久国产精品| 美女黄色丝袜一区| 精品中文字幕久久久久久| 国产精品手机播放| 午夜精品久久久久久久99热浪潮| 国内免费久久久久久久久久久| 在线视频精品一| 午夜免费在线观看精品视频| 久久久精品一区二区三区| 久久的精品视频| 国产香蕉97碰碰久久人人| 不用播放器成人网| 久热精品视频在线免费观看|