redis的互斥锁自身可以设置过期时间防止进程崩溃成为死锁,如果抢券过程中出现什么异常则手动删除该锁(这里需要权衡是手动删除还是等他自动过期)
//请求进来,需要检查参数和验证码等是否合法
//该检查的都检查下
//这里开始真正操作
try{
$expire=2; //过期时间2秒
if($redis->set('lock_name', 'lock_value', ['nx', 'ex'=>$expire])){
//此时第一个正常请求进来后 其他请求都排除掉了 开始正常代码
} else {
//此时应该提示请求已经在处理了 提示用户重复提交
}
} catch(Exception $ex){
//手动删除锁或者不作为等锁过期?
$redis->del('lock_name');
//返回抢券失败
}
此处不建议手动删除排他锁,因为正常一个请求过来如果失败,下一次需要获取验证码的,其实时间足够的。 如果手动删除很可能由于请求时间过长最后失败删除锁造成删除其他不该删除的锁导致内容重复。当然具体问题具体分析。
网友评论