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