首页 > 编程知识 正文

php yii2,redis使用lua脚本加锁和解锁

时间:2023-05-04 01:11:59 阅读:22450 作者:4596

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;

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。