Laravel调度器onOneServer()遇cache:clear失效,如何分用缓存驱动?
Laravel多实例下用Redis做分布式锁且不影响默认缓存的方案
当然有内置方案,按下面几步操作就能解决你的问题:
配置专属Redis缓存连接
在config/cache.php的stores数组中新增一个专门用于存储分布式锁的Redis连接,比如命名为lock:'lock' => [ 'driver' => 'redis', 'connection' => 'default', // 复用你已有的Redis连接即可,也可单独配置 'lock_timeout' => 60, // 锁超时时间,根据任务实际执行时长调整 ],为调度任务指定锁的缓存驱动
在Console/Kernel.php的调度代码中,通过usingCache方法指定使用刚才配置的lock缓存连接来存储锁,不用修改默认的CACHE_DRIVER:$schedule->command('subscription:autorenew') ->everyMinute() ->withoutOverlapping() ->onOneServer() ->usingCache('lock'); // 关键:指定锁用的缓存连接避免部署时的缓存清除影响锁
默认的php artisan cache:clear只会清除默认缓存驱动(也就是你设置的file)的数据,而锁存在单独的Redis连接里,所以执行这个命令不会清除Redis中的锁,完全不用担心任务执行中锁被意外释放。如果之后需要单独清除锁的缓存,可执行php artisan cache:clear --store=lock,但部署流水线里不需要加这个。额外注意事项
- 确保Redis服务稳定,分布式锁依赖Redis的可用性;
lock_timeout的值要设置得比任务最长执行时间长,防止任务还在运行锁就过期;- 所有需要分布式锁的调度任务,都要加上
->usingCache('lock')统一使用这个Redis连接。
内容的提问来源于stack exchange,提问作者ajay makwana
相关产品推荐
相关产品推荐

