久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

Redis構(gòu)建分布式鎖

本文主要介紹了Redis構(gòu)建分布式鎖的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧

1、前言

為什么要構(gòu)建鎖呢?因?yàn)闃?gòu)建合適的鎖可以在高并發(fā)下能夠保持?jǐn)?shù)據(jù)的一致性,即客戶端在執(zhí)行連貫的命令時(shí)上鎖的數(shù)據(jù)不會(huì)被別的客戶端的更改而發(fā)生錯(cuò)誤。同時(shí)還能夠保證命令執(zhí)行的成功率。

看到這里你不禁要問(wèn)redis中不是有事務(wù)操作么?事務(wù)操作不能夠?qū)崿F(xiàn)上面的功能么?

的確,redis中的事務(wù)可以watch可以監(jiān)控?cái)?shù)據(jù),從而能夠保證連貫執(zhí)行的時(shí)數(shù)據(jù)的一致性,但是我們必須清楚的認(rèn)識(shí)到,在多個(gè)客戶端同時(shí)處理相同的數(shù)據(jù)的時(shí)候,很容易導(dǎo)致事務(wù)的執(zhí)行失敗,甚至?xí)?dǎo)致數(shù)據(jù)的出錯(cuò)。

在關(guān)系型數(shù)據(jù)庫(kù)中,用戶首先向數(shù)據(jù)庫(kù)服務(wù)器發(fā)送BEGIN,然后執(zhí)行各個(gè)相互一致的寫(xiě)操作和讀操作,最后用戶可以選擇發(fā)送COMMIT來(lái)確認(rèn)之前的修改,或者發(fā)送ROLLBACK進(jìn)行回滾。

在redis中,通過(guò)特殊的命令MULTI為開(kāi)始,之后用戶傳入一連貫的命令,最后EXEC為結(jié)束(在這一過(guò)程中可以使用watch進(jìn)行監(jiān)控一些key)。進(jìn)一步分析,redis事務(wù)中的命令會(huì)先推入隊(duì)列,等到EXEC命令出現(xiàn)的時(shí)候才會(huì)將一條條命令執(zhí)行。假若watch監(jiān)控的key發(fā)生改變,這個(gè)事務(wù)將會(huì)失敗。這也就說(shuō)明Redis事務(wù)中不存在鎖,其他客戶端可以修改正在執(zhí)行事務(wù)中的有關(guān)數(shù)據(jù),這也就為什么在多個(gè)客戶端同時(shí)處理相同的數(shù)據(jù)時(shí)事務(wù)往往會(huì)發(fā)生錯(cuò)誤。

2、簡(jiǎn)單理解redis的單線程IO多路復(fù)用

Redis采用單線程IO多路復(fù)用模型來(lái)實(shí)現(xiàn)高內(nèi)存數(shù)據(jù)服務(wù)。何為單線程IO多路復(fù)用呢?從字面的意思可以知道redis采用的是單線程、使用的是多個(gè)IO。整個(gè)過(guò)程簡(jiǎn)單的來(lái)講就是,哪個(gè)命令的數(shù)據(jù)流先到達(dá)就先執(zhí)行。

請(qǐng)看下面的形象理解圖:圖中是一座窄橋,只能允許一輛車(chē)通過(guò),左邊是車(chē)輛進(jìn)入的通道,哪一輛車(chē)先到達(dá)就先進(jìn)入。即哪個(gè)IO流先到達(dá)就先處理哪個(gè)。

Linux下網(wǎng)絡(luò)IO使用socket套接字來(lái)通訊,普通IO模型只能監(jiān)聽(tīng)一個(gè)socket,而IO多路復(fù)用可同時(shí)監(jiān)控多個(gè)socket。IO多路復(fù)用避免阻塞在IO上,單線程保存多個(gè)socket的狀態(tài)后輪循處理。

3、并發(fā)測(cè)試

我們就模擬一個(gè)簡(jiǎn)單典型的并發(fā)測(cè)試,然后從這個(gè)測(cè)試中得出問(wèn)題,再進(jìn)一步研究。

并發(fā)測(cè)試思路:

1、在redis中設(shè)置一個(gè)字符串count,運(yùn)用程序?qū)⑵淙〕鰜?lái)加+1,再存儲(chǔ)回去,一直循環(huán)十萬(wàn)次

2、在兩個(gè)瀏覽器上同時(shí)執(zhí)行這個(gè)代碼

3、將count取出來(lái),查看結(jié)果

測(cè)試步驟:

1、建立test.php文件

<?php
$redis=new Redis();
$redis->connect('192.168.95.11','6379');
for ($i=0; $i < 100000; $i++) 
{ 
 $count=$redis->get('count');
 $count=$count+1;
 $redis->set('count',$count); 
}
echo "this OK";
?>

2、分別在兩個(gè)瀏覽器中訪問(wèn)test.php文件

結(jié)果由上圖可知,總共執(zhí)行兩次,count原本應(yīng)該是二十萬(wàn)才對(duì)的,但實(shí)際上count等于十三萬(wàn)多,遠(yuǎn)遠(yuǎn)小于二十萬(wàn),這是為什么呢?

由前面的內(nèi)容可知,redis是采用單線程IO多路復(fù)用模型的。因此我們使用兩個(gè)瀏覽器即為兩個(gè)會(huì)話(A、B),取出、加1、存入這三個(gè)命令并不是原子操作,并且在執(zhí)行取出、存入這兩個(gè)redis命令時(shí)是哪個(gè)客戶端先到就先執(zhí)行。

例如:

1、此時(shí)count=120

2、A取出count=120,緊接著B(niǎo)的取出命令流到了,也將count=120取出

3、A取出后立即加1,并將count=121存回去

4、此時(shí)B也緊跟著,也將count=121存進(jìn)去了

注意:

1、設(shè)置循環(huán)次數(shù)盡量大一點(diǎn),太小的話,當(dāng)在第一個(gè)瀏覽器執(zhí)行完畢,第二個(gè)瀏覽器還沒(méi)開(kāi)始進(jìn)行呢

2、必須要兩個(gè)瀏覽器同時(shí)執(zhí)行。假若在一個(gè)瀏覽器中同時(shí)執(zhí)行兩次test.php文件,不管是否同時(shí)執(zhí)行,最終結(jié)果就是count=200000。因?yàn)樵谕粋€(gè)瀏覽器中執(zhí)行,都是屬于同一個(gè)會(huì)話(所有命令都在同一個(gè)通道通過(guò)),所以redis會(huì)讓先執(zhí)行的十萬(wàn)次執(zhí)行完,再接著執(zhí)行其他的十萬(wàn)次。

4、事務(wù)解決與原子性操作解決

4.1、事務(wù)解決

更改后的test.php文件

<?php
header("content-type: text/html;charset=utf8;");
$start=time();
$redis=new Redis();
$redis->connect('192.168.95.11','6379');
for ($i=0; $i < 100000; $i++) 
{ 
 $redis->multi();
 $count=$redis->get('count');
 $count=$count+1;
 $redis->set('count',$count);
 $redis->exec();
}
$end=time();
echo "this OK<br/>";
echo "執(zhí)行時(shí)間為:".($end-$start);
?>

執(zhí)行結(jié)果失敗,表名使用事務(wù)不能夠解決此問(wèn)題。

分析原因:

【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過(guò)測(cè)試外,其他素材未做測(cè)試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要介紹了PHP使用Redis長(zhǎng)連接的方法,結(jié)合實(shí)例形式詳細(xì)分析php操作redis長(zhǎng)連接的使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
這篇文章主要為大家詳細(xì)介紹了php+redis消息隊(duì)列搶購(gòu)實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
這篇文章主要為大家詳細(xì)介紹了php+redis實(shí)現(xiàn)商城秒殺功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
這篇文章主要介紹了PHP基于redis計(jì)數(shù)器類定義與用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了php定義的redis計(jì)數(shù)器類及其相關(guān)使用技巧,需要的朋友可以參考下
下面小編就為大家分享一篇PHP+Redis 消息隊(duì)列 實(shí)現(xiàn)高并發(fā)下注冊(cè)人數(shù)統(tǒng)計(jì)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
這篇文章主要介紹了CI框架(CodeIgniter)操作redis的方法,結(jié)合實(shí)例形式詳細(xì)分析了CodeIgniter框架針對(duì)redis數(shù)據(jù)庫(kù)操作的相關(guān)配置與使用技巧,需要的朋友可以參考下
主站蜘蛛池模板: a免费视频 | 日韩中出 | 91精品国产91久久久久青草 | 日本不卡一区 | 青青草网| 日本免费在线观看视频 | 色视频在线播放 | 一区二区三区成人 | 国产精品日韩欧美一区二区三区 | 亚洲精品久久久蜜桃 | 国产精品久久久久久久久久免费看 | 久久99深爱久久99精品 | www.久久久.com | 综合色影院 | 香蕉一区二区 | 久久精品中文字幕 | 久久精品91久久久久久再现 | 亚洲视频在线看 | 超碰91在线| 日韩精品一区二区三区久久 | 久久国产高清 | 中文字幕不卡在线观看 | 玖玖在线精品 | 欧美日韩亚洲一区二区 | 国产一区二区视频在线 | 超碰97人人人人人蜜桃 | 成人国产一区二区三区精品麻豆 | 久久精品久久精品久久精品 | 久久综合久色欧美综合狠狠 | 久久在线| 青青草中文字幕 | 国产小视频在线观看 | 午夜精品福利视频 | 国产97碰免费视频 | 日韩电影一区二区三区 | 麻豆精品国产91久久久久久 | 在线亚洲免费视频 | 在线视频日韩 | 日本高清视频在线播放 | 日韩欧美一级精品久久 | 国产精品区一区二 |