php
public $mutexName = 'xxxxx'; //固定的值 protected function checkThread() { \Yii::$app->setComponents([ 'mutex' =>[ 'class' => 'yii\redis\Mutex', 'expire' => 300, ], ]); return \Yii::$app->mutex->acquire($this->mutexName, 10); }
有个定时任务,每次执行前我都会调用一下checkThread
去获取锁,获取不到就退出。
现在有多台机器设置了同样时刻的这个计划任务,在同一时间执行了这定时任务,我发现还是重复执行了后面的业务逻辑。
这是这个获取锁没效?
1 ljwaheng 2020-06-17 18:05:21 +08:00 这种是不是可以用 Redis 的 setnx 保证只有一个客户端获取锁? ( ex 设置过期时间)不过解锁的时候最好使用 Lua 解锁. |
![]() | 4 surfire91 2020-06-17 18:32:23 +08:00 猜测一个原因: 锁是不是有实效?如果有实效的话,虽然你多台机器设置了同样时刻,但是不同机器时间可能存在误差,导致顺序执行了。比如 a 机器执行完了(锁销毁了),b 机器才开始执行任务(这个时候是能获取到锁到)。 |
![]() | 5 monsterxx03 2020-06-17 18:35:39 +08:00 连到 redis 上, 用 monitor 指令看下这封装代码具体干了什么 |
7 dyllen OP @monsterxx03 源码我都看过了,就两个操作,加锁 set nx px,解锁用的 lua,没了。 |
9 dyllen OP @surfire91 我是说你说的这个情况,不会有问题。顺序执行了,或者哪个先,那个后执行都不会有问题。 这种锁本来就是执行完了就释放的。 |
![]() | 10 couashi 2020-06-19 09:32:17 +08:00 建议后期应该部署定时任务管理后台 |