Redis 樂觀鎖詳解及應用

havepop 8年前發布 | 21K 次閱讀 Redis NoSQL數據庫

在Redis的事務中,WATCH命令可用于提供CAS(check-and-set)功能。假設通過WATCH命令在事務執行之前監控了某個key,倘若在WATCH之后Key的值發生了變化,EXEC命令執行的事務將被放棄,同時返回nil以通知調用者事務執行失敗:

redis> SET key 1
OK
redis> WATCH key
OK
redis> SET key 2
OK
redis> MULTI
OK
redis> SET key 3
QUEUED
redis> EXEC
(nil)
redis> GET key
"2"

因此,借用redis使用watch可以完成秒殺搶購功能,使用redis中兩個key完成秒殺搶購功能,mywatchkey用于存儲搶購數量和mywatchlist用戶存儲搶購列表。

php示例代碼:

<?php  
$redis = new redis();  
$result = $redis->connect('127.0.0.1', 6379);  
$mywatchkey = $redis->get("mywatchkey");  
$rob_total = 100;   //搶購數量  
if($mywatchkey<$rob_total){  
    $redis->watch("mywatchkey");  
    $redis->multi();  

    //設置延遲,方便測試效果。  
    sleep(5);  
    //插入搶購數據  
    $redis->hSet("mywatchlist","user_id_".mt_rand(1, 9999),time());  
    $redis->set("mywatchkey",$mywatchkey+1);  
    $rob_result = $redis->exec();  
    if($rob_result){  
        $mywatchlist = $redis->hGetAll("mywatchlist");  
        echo "搶購成功!<br/>";  
        echo "剩余數量:".($rob_total-$mywatchkey-1)."<br/>";  
        echo "用戶列表:<pre>";  
        var_dump($mywatchlist);  //打印搶購成功用戶
    }else{  
        echo "手氣不好,再搶購!";exit;  
    }  
}

 

來自: http://www.36nu.com/post/176.html

 

 本文由用戶 havepop 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!