当前位置: 首页 > news >正文

线上问题-redis分布式锁 - Charlie

一、问题描述:在xxl-job中,因为项目使用了mysql的悲观锁,导致加锁时间非常慢,因此采用了redis的分布式锁,发现5个进程同时运行时,有的任务同一秒钟会触发两次,导致撮合系统压力巨大。
二、问题定位
2.1、工作原理:
现货任务是通过定时任务执行的,执行周期可配置,然后定时任务会定时执行该任务。
通过xxl-job的执行日志的调度时间有时同一秒调用两次同一个任务,可分析处应该是调度系统出现问题,当任务执行周期设置为5秒时,应该是每5秒执行一次。
三、机理分析
正常情况下,xxljob获取数据的条数是根据(快的线程池中最大线程数+慢的线程池最大线程数)*20=本次最多可以执行多少个定时任务。每次执行任务是查询数据库的条件是本次最多可执行的任务数和当前时间+5秒的数据。有6个进程在同时执行这块的逻辑,只有抢到锁的进程才能真正的查询数据库做后面的操作。
而当前的处理的逻辑恰好是分布式的逻辑出现问题导致同一秒任务会重复执行。下面是发生问题的代码。hasKey和stringRedisTemplate.opsForValue().set方法并不是原子性操作,在多线程的情况下存在竞态场景,A线程发现key不存在,于是加锁,当A正在加锁但是没有加锁成功时,此时B也判断是否有key,于是B也去加锁,而stringRedisTemplate.opsForValue().set方法会直接覆盖之前的锁,这样就会导致多个线程会覆盖之前的锁。

public void lock() {if(!stringRedisTemplate.hasKey(lockKey)){Long redisLockTimeout = XxlJobAdminConfig.getAdminConfig().getRedisLockTimeout();stringRedisTemplate.opsForValue().set(lockKey,"1",redisLockTimeout, TimeUnit.SECONDS);isLock = true;}}

更重要的下面是这段代码,加了锁之后直接就开始查询数据库了,并没有判断锁是否加成功。这就导致了任务会重复执行的另一个原因,就等于没有加锁,任何进程都可以随时调用这块的逻辑。

 long addlockStartTime = System.currentTimeMillis();distributedLock.lock();long addlockEndTime = System.currentTimeMillis();logger.info(">>>>>>>>> addLock cost:{}ms",addlockEndTime-addlockStartTime);// 1、pre readlong nowTime = System.currentTimeMillis();List<XxlJobInfo> scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount);

四、问题复现
该问题为固有问题,测试环境均可以复现。
五、措施及验证情况

http://www.zskr.cn/news/125279.html

相关文章:

  • 第一次装修新房选哪家装修公司最省心?避坑指南+优质公司推荐 - 品牌测评鉴赏家
  • CSAPP 程序的链接
  • 2025年12月必看:中国电缆一线品牌推荐:中国电缆知名品牌盘点完整版 - 品牌2026
  • AI元人文构想:走向意义主权的文明革命
  • 2025 广州编程机构怎么选?5 家高口碑机构避坑指南附试听 - 品牌测评鉴赏家
  • 孩子学什么对未来有帮助?这 3 条黄金赛道 + 靠谱机构清单,帮你提前规划! - 品牌测评鉴赏家
  • 少儿编程机构怎么选?这3类口碑好课帮你避开90%的坑 - 品牌测评鉴赏家
  • 小学生兴趣班挑选指南:没有“最好”,只有“最适合” - 品牌测评鉴赏家
  • 小学兴趣班怎么选?2025口碑机构测评 - 品牌测评鉴赏家
  • 构建你的需求思维框架 - 智慧园区
  • 干货 | 这些少儿编程,帮你找到孩子的编程启蒙好帮手 - 品牌测评鉴赏家
  • 北京SAT辅导机构怎么选?这篇攻略帮你避坑提分 - 品牌测评鉴赏家
  • 托福一对一机构怎么选?3 个核心法则 + 实用避坑指南 - 品牌测评鉴赏家
  • 2025北京托福机构选课攻略:高分党亲测,这几家用对了提分超高效! - 品牌测评鉴赏家
  • 托福机构怎么选?2025高性价比测评速览 - 品牌测评鉴赏家
  • 2025前十强EC风机,离心风机,,负压风机,风机品牌推荐,外转子风机厂家推荐选择指南 - 栗子测评
  • 2025雅思培训机构优选清单:大数据测评,这几家放心选 - 品牌测评鉴赏家
  • 洗牙 到底 医院好 还是 诊所好 ,医院 居然要用医保 1000才能搞定 ,诊所就 一百多
  • 雅思封闭班怎么选?高口碑机构避坑指南与提分攻略 - 品牌测评鉴赏家
  • 2025云南最新隔热膜公司top5推荐,昆明等地优质施工服务商及品牌权威榜单发布,技术赋能构筑汽车防护新生态 - 全局中转站
  • 托福培训机构怎么选?2025年高性价比机构推荐指南 - 品牌测评鉴赏家
  • 孩子吵着学AI?口碑机构帮你避开90%的坑 - 品牌测评鉴赏家
  • 2025年杭州民办高中推荐,杭州民办高中特色班,民办高中美术班,杭州民办高中口碑,民办高中师资,民办高中升学率选择指南 - 栗子测评
  • 代码随想录Day44_DP_最长公共子序列
  • 2025雅思封闭班怎么选?黑马机构凭什么让考生30天提分20+? - 品牌测评鉴赏家
  • 2025 雅思报班攻略:避开大流机构,这些高性价比选择更适合你 - 品牌测评鉴赏家
  • 2025科技特长生培养指南:5大优质机构深度解析与避坑攻略 - 品牌测评鉴赏家
  • 托福一对一机构怎么选?2025 高性价比推荐与避坑指南 - 品牌测评鉴赏家
  • 2025 年 SAT 辅导机构怎么选?无老师国际领衔 5 家高性价比机构值得关注 - 品牌测评鉴赏家
  • 超神十年终极进化!微星MEG X870E GODLIKE X EDITION主板评测:AMD最强音 没有之一