0

0

基于Redis分布式锁的任务调度怎么实现

WBOY

WBOY

发布时间:2023-05-28 13:37:30

|

812人浏览过

|

来源于亿速云

转载

在分布式大批量数据采集过程中,信源的管理尤为重要。为了确保同一任务在同一时间只能被一个采集器处理,必须保证任务调度的独一无二性。通常我们在进行分布式数据采集时,一般情况下都会有一个调度模块,其主要的职责就是负责采集任务的分发,同时保证任务的唯一性。

由于是分布式,涉及到多台服务器(多机),每台服务器又涉及到多个采集器(多进程),每个采集器又有可能涉及到多线程,所以,任务调度模块中的锁机制显得尤为重要。根据应用的实现架构不同,锁的实现方式通常可以分为以下几种类型

如果处理程序是单进程多线程的,在 python下,就可以使用 threading 模块的 Lock 对象来限制对共享变量的同步访问,实现线程安全。单机多进程的情况,在 python 下,可以使用 multiprocessing 的 Lock 对象来处理。多机多进程部署的情况,就得依赖一个第三方组件(存储锁对象)来实现一个分布式的同步锁了。

由于调度模块是多机多进程多线程的处理机制,所以符合第三种方式。

分布式锁实现方式

目前主流的分布式锁实现方式有以下几种:

  • 基于数据库来实现,如 mysql

  • 基于缓存来实现,如 redis

  • 基于 zookeeper 来实现

每种实现方式各有千秋,综合考量,Redis是最为合适的选择。主要原因是:

  • redis 是基于内存来操作,存取速度比数据库快,在高并发下,加锁之后的性能不会下降太多

  • redis 可以设置键值的生存时间(TTL)

  • redis 的使用方式简单,总体实现开销小

但是,使用 redis 实现的分布锁还需要具备以下几个条件:

  1. 同一个时刻只能有一个线程占有锁,其他线程必须等待直到锁被释放

  2. 锁的操作必须满足原子性

  3. 不会发生死锁,例如已获得锁的线程在释放锁之前突然异常退出,导致其他线程会一直在循环等待锁被释放

  4. 锁的添加和释放必须由同一个线程来设置

我们使用 redis 来实现一个分布式同步锁,来保证数据的一致性,需满足一下特点:

  • 满足互斥性,同一个时刻只能有一个线程可以获取锁

  • 利用 redis 的 ttl 来确保不会出现死锁,但同时也会带来由于锁过期引发的多线程同时占有锁的问题,需要我们合理设置锁的过期时间来避免

  • 利用锁的唯一性来确保不会出现误删锁的情况

我在实际操作过程中,把调度模块从整个采集系统中拆离了出来,基于Java客户端Jredis(JRedis是一个高性能的Java客户端,用来连接到Redis分布式哈希键-值数据库。一个独立的服务,使用Spring Boot实现了同步和异步功能。以便其他各个采集器,通过HTTP方式请求所要处理的采集任务。其处理过程大致如下:

  • 采集器通过HTTP方式,向调度中心发送任务请求;

  • 调度中心判断锁是否存在,如果存在则直接返回空集合;

  • 如果不存在锁,则对请求加锁,然后根据信源规则获取相应的采集任务;

  • 返回获取到的任务(如果没有待处理任务,则返回空),然后删除锁。

    拍我AI
    拍我AI

    AI视频生成平台PixVerse的国内版本

    下载

调度模块的代码实现,大致如下所示:

public static List fetchTask(String lockKeyValue, RedisHashUtils redisHashUtils, HttpServletRequest request,

HashServiceInterface hif, ZSetServiceInterface zScoreSet, String dicName) {

List result = new ArrayList();

     try {

         String dicNameLock = "Dispatcher_Task_Lock";// 任务调度锁;

         if (!redisHashUtils.keyIsExit(dicNameLock, lockKeyValue)) {// 判断锁是否存在

         // 添加锁(把任务唯一性标识写入记录);

          redisHashUtils.addOneData(dicNameLock, lockKeyValue,

            DateUtil.getYMDHMS());

         // 处理任务逻辑

        ..............................................

         // 删除锁(任务唯一性标识);

         hsdi.remove(redisHashUtils, dicNameLock, lockKeyValue);

很抱歉,您没有提供需要重写的原话,无法进行重写 else {

            //锁已存在

         System.out.println("正在处理任务,暂时返回空集合....");

很抱歉,您没有提供需要重写的原话,无法进行重写

     } catch (

     Exception e) {e.printStackTrace();

     }

return result;

}

在实际的操作过程中,在进行锁添加时,必须要给锁加上过期时间,否则出现某些不可知的异常时,可能会导致锁无法释放,采集器一直无法获取到采集任务的情况。

相关专题

更多
Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

11

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

4

2026.01.21

无人机驾驶证报考 uom民用无人机综合管理平台官网
无人机驾驶证报考 uom民用无人机综合管理平台官网

无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

16

2026.01.21

Python多线程合集
Python多线程合集

本专题整合了Python多线程相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.21

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.21

windows激活码分享 windows一键激活教程指南
windows激活码分享 windows一键激活教程指南

Windows 10/11一键激活可以通过PowerShell脚本或KMS工具实现永久或长期激活。最推荐的简便方法是打开PowerShell(管理员),运行 irm https://get.activated.win | iex 脚本,按提示选择数字激活(选项1)。其他方法包括使用HEU KMS Activator工具进行智能激活。

2

2026.01.21

excel表格操作技巧大全 表格制作excel教程
excel表格操作技巧大全 表格制作excel教程

Excel表格操作的核心技巧在于 熟练使用快捷键、数据处理函数及视图工具,如Ctrl+C/V(复制粘贴)、Alt+=(自动求和)、条件格式、数据验证及数据透视表。掌握这些可大幅提升数据分析与办公效率,实现快速录入、查找、筛选和汇总。

6

2026.01.21

毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm
毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm

毒蘑菇VOLUMESHADER_BM测试网站网址为https://toolwa.com/vsbm/,该平台基于WebGL技术通过渲染高复杂度三维分形图形评估设备图形处理能力,用户可通过拖动彩色物体观察画面流畅度判断GPU与CPU协同性能;测试兼容多种设备,但中低端手机易卡顿或崩溃,高端机型可能因发热降频影响表现,桌面端需启用独立显卡并使用支持WebGL的主流浏览器以确保准确结果

23

2026.01.21

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

7

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号