redis使用watch完成秒杀抢购功能:php
使用redis中两个key完成秒杀抢购功能,mywatchkey用于存储抢购数量和mywatchlist用户存储抢购列表。html
它的优势以下:java
1. 首先选用内存数据库来抢购速度极快。redis
2. 速度快并发天然没不是问题。数据库
3. 使用悲观锁,会迅速增长系统资源。并发
4. 比队列强的多,队列会使你的内存数据库资源瞬间爆棚。测试
5. 使用乐观锁,达到综合需求。spa
我以为如下代码确定是你想要的。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>"; var_dump($mywatchlist); }else{ echo "手气很差,再抢购!";exit; } } ?>