用Redisson实现限流,结果锁竟然失效了!

“CPU飙到90%,内存占用80%”

手机屏幕的蓝光在黑暗里格外刺眼。我揉了揉眼睛,盯着监控图表——明明加了分布式锁限制60秒一次,为什么短短10秒内连续执行了3次任务?

我又仔细对了一遍代码,系统原本有一个非常耗时耗内存、但是低频的操作,为了防止影响系统性能三年前的前辈加了分布式锁,限制每个用户一分钟只能请求一次,简化后的代码如下:

// Redisson分布式锁,60秒只能执行一次
RLock lock = redissonClient.getLock("MY_LOCK:" + request.getUserId());
if (lock.tryLock(0, 60, SECONDS)) {
    try {
        doTask(); // 执行耗时耗内存的任务
    } finally {
        // 不释放锁,60秒后自动过期!
    }
}

逻辑看似完美,但现实却狠狠打脸。我翻身下床,打开电脑,一场与“幽灵锁”的战争就此开始……


第一回合:锁Key不唯一?

第一回合:锁Key不唯一?怀疑点

  • • 锁Key是否动态变化?

  • • Redis是否异常?

排查

查询日志,发现 request.getUserId() 是相同的,也就是说锁Key是一样的,非动态变化。在20秒内一共请求了26次,这手速...不是,大半夜运营小姐姐还在加班?杯