csredis icon indicating copy to clipboard operation
csredis copied to clipboard

使用Lock还是会重复执行

Open lilinjian2001 opened this issue 3 years ago • 4 comments

在Quartz分布式集群中,希望通过使用Lock解决并发问题,但是所有机器上的任务还是会执行,请问是什么问题呢?

public async Task Execute(IJobExecutionContext context)
{
     using (var Lock = RedisHelper.Lock(redisKey, 10))
     {
          //业务代码
     }
}

有没有Lock完整的示例代码?

lilinjian2001 avatar Jul 29 '22 07:07 lilinjian2001

RedisHelper.Lock 是控制不同时执行,不是不执行。

2881099 avatar Jul 29 '22 07:07 2881099

顺便推荐一下 FreeScheduler

//每5秒触发,执行N次
var id = scheduler.AddTask("topic1", "body1", round: -1, 5);

//每次 不同的间隔秒数触发,执行6次
var id = scheduler.AddTask("topic1", "body1", new [] { 5, 5, 10, 10, 60, 60 });

//每天 20:00:00 触发,执行N次
var id = scheduler.AddTaskRunOnDay("topic1", "body1", round: -1, "20:00:00");

//每周一 20:00:00 触发,执行1次
var id = scheduler.AddTaskRunOnWeek("topic1", "body1", round: 1, "1:20:00:00");

//每月1日 20:00:00 触发,执行12次
var id = scheduler.AddTaskRunOnMonth("topic1", "body1", round: 12, "1:20:00:00");

//自定义间隔
var id = scheduler.AddTaskCustom("topic1", "body1", "0/1 * * * * ? ");

https://github.com/2881099/FreeScheduler FreeScheduler 轻量化定时任务调度,支持临时的延时任务和重复循环任务(可持久化),可按秒,每天/每周/每月固定时间,自定义间隔执行,支持 .NET Core 2.1+、.NET Framework 4.0+ 运行环境。

集成后台系统 - 管理任务

// 使用 SQL 查询 TaskInfo、TaskLog 两个表进行分页显示

//暂停任务
scheduler.PauseTask(id);
//恢复暂停的任务
scheduler.ResumeTask(id);
//删除任务
scheduler.RemoveTask(id);

2881099 avatar Jul 29 '22 07:07 2881099

额..... 跟我想象的有点不一样,我理解的是使用 RedisHelper.Lock 后,其中一台机子执行,另外的因为有分布式锁,则不执行。请问RedisHelper有没有提供类似的方法呢?

lilinjian2001 avatar Jul 29 '22 07:07 lilinjian2001

lock(xx) { if (...) { } }

有没有用过这种代码

2881099 avatar Jul 29 '22 08:07 2881099