최근 플래시세일 이벤트를 진행했는데, 성능과 응답속도를 위해 redis를 사용했습니다. 글을 쓸 때 초자연적인 현상을 방지하는 데 특별한 주의를 기울였습니다. Redis 이론을 기반으로 하는 cas(check and set) 낙관적 잠금을 사용하면 이 문제를 해결할 수 있을 것이라고 생각했지만 여전히 매우 혼란스럽습니다. 구체적인 코드는 대략 다음과 같습니다.
<code><?php header("content-type:text/html;charset=utf-8"); $redis = new redis(); $result = $redis->connect('10.10.10.119', 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 class="brush:php;toolbar:false">"; var_dump($mywatchlist); }else{ echo "手气不好,再抢购!";exit; } } ?> </code>