一、利用incr实现原子性的递增
例如需求:一个手机号一分钟只能发送一次短信验证码。
$number = $client->incr('number');if ($number == 1) {//发送验证码} else {//limit 1次/1分钟}
二、利用redis锁、监听、事务等
例如需求:10:00准时开放抢购,限前100人。
$expireTime = 500000; //锁过期时间50ms$key = 'lock';$microtime = 0;//循环设置锁,如果锁已经存在则继续循环while (1) {$microtime = microtime(true) * 1000 * 1000 + $expireTime;$setn = $client->setnx($key, $microtime);if ($setn) {break;}//监听锁$client->watch($key);//获取别人锁设置的时间$expire = $client->get($key);//当前时间早就超过了别人锁的时间if ($expire && $expire < microtime(true) * 1000 * 1000) {//开启事务$client->multi();//这锁归我用了(更新锁的时间,并返回锁的旧时间赋值给变量)$oldExpire = $client->getset($key, microtime(true) * 1000 * 1000 + $expireTime);if ($client->exec() && $oldExpire && $oldExpire < microtime(true) * 1000 * 1000) {//锁归我成功,推出找锁循环break;}} else {//取消监听锁$client->unwatch();}//一次循环结束,usleep(3000);}//进入到此,说明锁在这个人手上$number = $client->get('number');if ($number >= 100) {$client->del($key);//醒醒,都抢光了}//其他操作usleep(rand(50000, 100000));//我抢到了,人数+1$number = $client->incr('number');//释放锁【锁还是自己的才需要实放】if ($client->get($key) == $microtime) {$client->del($key);}

