yii2框架的简单锁定在未执行此次任务之前,不允许重新请求此次方法。 注意,虽然简单实现几乎可以处理所有并发方案,但如果并发要求绝对,它将通过队列和异步处理实现。
$key='redis_key_name:'.'订单id或其他本次锁定的唯一值';
//判断为不为空,直接中断这次操作
if (! empty (yii :3360 $ app-redis-get ) $key ) }
//你们可以自由return和其他友好的输出,下一个输出只是个人的例子
thrownewexception(-10007,'正在接收红包。 稍后');
}
//确保未锁定,然后先分配并锁定redis
yii :3360 $ app-redis-set ($ key,'1); //随便标1
yii :3360 $ app-redis-expire ($ key,300 ); //锁定时间,具体看自己的业务场景,通常来自一个接口的请求在60秒以下
//这里需要使用try catch,防止中途出现异常,锁定被解除
try {
? //具体处理的业务逻辑代码
yii :3360 $ app-redis-del ($ key ); //业务逻辑处理结束,解除锁定
}catch(throwable$e ) {
yii :3360 $ app-redis-del ($ key ); //业务逻辑处理失败还是解除锁定
//日志记录方法,具体由自己实现
核心helper :3360 write (JSON _ encode ([ ' event name ',' order_id'=$order-order_id? ''、$e-getMessage ()、JSON_UNESCAPED_UNICODE );
}
注意:
1、Throwable是php7以上的万能捕获。 用于php7或更低版本: Exception
2、请确认在配置文件中设置了redis配置
找到config/development.php (开发环境)或config/production.php (生产环境) ),并将其添加到“components”=[ ] (如:所示)
' components'=[
' redis'=[
' class '=' basecomponentsaseredisconn ',
' hostname'='127.0.0.1 ',
“端口”=6379,
]、
]
3、如果找不到Yii,请在命名空间后添加use Yii;