You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:44:59