记一次自定义Redis分布式锁导致的生产事件

本文记录了一次由于自定义Redis分布式锁导致的生产事件。异常源于在key不存在时仍尝试加锁,分析了可能的原因,如key被删除或过期。提出了包括使用Lua脚本确保原子性、定时续期锁、实现线程级别的可重入锁等解决方案,并推荐使用Redisson客户端以避免类似问题。最后强调了分布式锁的正确使用和代码审查的重要性。
摘要由CSDN通过智能技术生成

背景

企微报警群里连续发出生产环境报错警告,报错核心信息如下:

redis setNX error java.lang.NumberFormatException: For input string: "null"
  at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
  at java.lang.Long.parseLong(Long.java:589)
  at java.lang.Long.parseLong(Long.java:631)

经异常信息定位,发现是项目中自定义的Redis分布式锁报错,并且该异常是在最近需求上线后突然出现,并且伴随该异常出现的,还有需求涉及的业务数据出现部分错乱的问题。

问题分析

老规矩,先贴涉及代码

//切面
public class RedisLockAspect{
  public void around(ProceedingJoinPoint pjp) {
    String key = "...";
    try {
      //阻塞,直到获取锁为止
      while (!JedisUtil.lock(key, timeOut)) {
        Thread.sleep(10);
      }
      //执行业务逻辑
      pjp.proceed();
    }finally {
      JedisUtil.unLock(key);
    }
  }
}

以上为自定义Redis分布式锁的切面,不看细节,只看整体逻辑,问题不大,那再看实际加锁方法。

public class JedisUtil{
  public static boolean
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值