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

Redis構建分布式鎖

本文主要介紹了Redis構建分布式鎖的相關知識。具有很好的參考價值,下面跟著小編一起來看下吧

1、前言

為什么要構建鎖呢?因為構建合適的鎖可以在高并發下能夠保持數據的一致性,即客戶端在執行連貫的命令時上鎖的數據不會被別的客戶端的更改而發生錯誤。同時還能夠保證命令執行的成功率。

看到這里你不禁要問redis中不是有事務操作么?事務操作不能夠實現上面的功能么?

的確,redis中的事務可以watch可以監控數據,從而能夠保證連貫執行的時數據的一致性,但是我們必須清楚的認識到,在多個客戶端同時處理相同的數據的時候,很容易導致事務的執行失敗,甚至會導致數據的出錯。

在關系型數據庫中,用戶首先向數據庫服務器發送BEGIN,然后執行各個相互一致的寫操作和讀操作,最后用戶可以選擇發送COMMIT來確認之前的修改,或者發送ROLLBACK進行回滾。

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

2、簡單理解redis的單線程IO多路復用

Redis采用單線程IO多路復用模型來實現高內存數據服務。何為單線程IO多路復用呢?從字面的意思可以知道redis采用的是單線程、使用的是多個IO。整個過程簡單的來講就是,哪個命令的數據流先到達就先執行。

請看下面的形象理解圖:圖中是一座窄橋,只能允許一輛車通過,左邊是車輛進入的通道,哪一輛車先到達就先進入。即哪個IO流先到達就先處理哪個。

Linux下網絡IO使用socket套接字來通訊,普通IO模型只能監聽一個socket,而IO多路復用可同時監控多個socket。IO多路復用避免阻塞在IO上,單線程保存多個socket的狀態后輪循處理。

3、并發測試

我們就模擬一個簡單典型的并發測試,然后從這個測試中得出問題,再進一步研究。

并發測試思路:

1、在redis中設置一個字符串count,運用程序將其取出來加+1,再存儲回去,一直循環十萬次

2、在兩個瀏覽器上同時執行這個代碼

3、將count取出來,查看結果

測試步驟:

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、分別在兩個瀏覽器中訪問test.php文件

結果由上圖可知,總共執行兩次,count原本應該是二十萬才對的,但實際上count等于十三萬多,遠遠小于二十萬,這是為什么呢?

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

例如:

1、此時count=120

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

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

4、此時B也緊跟著,也將count=121存進去了

注意:

1、設置循環次數盡量大一點,太小的話,當在第一個瀏覽器執行完畢,第二個瀏覽器還沒開始進行呢

2、必須要兩個瀏覽器同時執行。假若在一個瀏覽器中同時執行兩次test.php文件,不管是否同時執行,最終結果就是count=200000。因為在同一個瀏覽器中執行,都是屬于同一個會話(所有命令都在同一個通道通過),所以redis會讓先執行的十萬次執行完,再接著執行其他的十萬次。

4、事務解決與原子性操作解決

4.1、事務解決

更改后的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 "執行時間為:".($end-$start);
?>

執行結果失敗,表名使用事務不能夠解決此問題。

分析原因:

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP使用Redis長連接的方法,結合實例形式詳細分析php操作redis長連接的使用方法及相關注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php+redis消息隊列搶購實現代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要為大家詳細介紹了php+redis實現商城秒殺功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要介紹了PHP基于redis計數器類定義與用法,結合實例形式較為詳細的分析了php定義的redis計數器類及其相關使用技巧,需要的朋友可以參考下
下面小編就為大家分享一篇PHP+Redis 消息隊列 實現高并發下注冊人數統計的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了CI框架(CodeIgniter)操作redis的方法,結合實例形式詳細分析了CodeIgniter框架針對redis數據庫操作的相關配置與使用技巧,需要的朋友可以參考下
主站蜘蛛池模板: 日韩蜜桃视频 | 亚洲 欧美 激情 另类 校园 | 国产精品视频一区二区三区四蜜臂 | av免费在线观看网站 | 久久久.com| 久久久久久亚洲国产精品 | 在线视频一区二区三区 | 欧美精品久久久 | 亚洲一区二区在线 | 日韩欧美亚洲综合 | 久久成人免费视频 | 久久丝袜| 91久操网| 亚洲成人免费网址 | 毛片综合| 日本国产精品视频 | 久久久久久国产精品mv | 超碰一区二区 | av中文字幕网 | 一本大道久久a久久精二百 欧洲一区二区三区 | 青青久草 | 91精品国产91久久久久久最新 | 成年人黄色一级毛片 | 91av在线免费观看 | 日韩在线一区二区三区 | 国产精品久久久久999 | 国产精品久久久久久久久久久久久久 | 久久亚洲国产精品 | 91精品一区二区三区久久久久 | 久久国产精99精产国高潮 | 精品日韩一区二区 | 国产a区 | 亚洲精品乱码久久久久久9色 | 精品久久久久久久人人人人传媒 | xxxxx黄色片| 国产精品日本一区二区在线播放 | 天天看片天天干 | 日韩淫片免费看 | 日韩精品亚洲专区在线观看 | 男女羞羞视频在线免费观看 | 亚洲成人综合网站 |