惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
Martin Fowler
Martin Fowler
云风的 BLOG
云风的 BLOG
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
The Blog of Author Tim Ferriss
大猫的无限游戏
大猫的无限游戏
A
About on SuperTechFans
小众软件
小众软件
博客园_首页
博客园 - 聂微东
罗磊的独立博客
Recent Announcements
Recent Announcements
U
Unit 42
N
Netflix TechBlog - Medium
Blog — PlanetScale
Blog — PlanetScale
阮一峰的网络日志
阮一峰的网络日志
博客园 - 叶小钗
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
D
DataBreaches.Net
Last Week in AI
Last Week in AI

博客园 - 幽州散人

SQL优化案例 synchronized 为啥会让虚拟线程卸载失效 主线任务和使命 温州3日之旅 CompletableFuture + 异步Servlet:同步的姿势、异步的效果 Snowflake雪花算法与发号器的应用 windows Java 幽灵转发壳进程 也谈MySQL limit offset深翻页问题 SHOW SESSION STATUS 与 Handler 变量 MySQL 5.7 Profiles 执行性能分析 MySQL临时表与文件排序 MySQL 5.7 MRR多范围读优化 MySQL 5.7 ICP索引条件下推优化 MySQL符合索引与最左前缀原则 从I/O 的物理成本理解回表和索引覆盖 第4个电瓶以及补漆 Flink原理:并行度与keyGroup桶 什么是数字批发银行 Java虚拟线程(三)实现原理 Java虚拟线程(二) Java虚拟线程(一) 大模型推理层服务化架构 传奇调查员之路:理智值-99,但我必须听懂深渊的语言 js里调用智能合约读/写函数的方法的区别 字节与其16进制字符表示转换的bug 交易心得 DexScreener接口初探 某安全软件跑飞了。。 Ed25519算法签名与验签的Java实现 Tendermint拜占庭容错引擎
Redisson分布式锁
幽州散人 · 2026-05-03 · via 博客园 - 幽州散人

模板代码了,属于是,可以直接拿来用。
最近在重构一个10年前的系统,当年分布式锁用setNx手搓的,现在直接用Redisson,看门狗机制省了在锁失效时间上纠结。

RLock lock = redissonClient.getLock("lock-" + key);
boolean locked = false;
try {
	locked = lock.tryLock(3, TimeUnit.SECONDS); //获取锁,wait 3秒超时,如果这3秒内被中断则抛InterruptedException
	if (locked) {
		//业务逻辑
		return RetCode.OK;
	} else {
		return RetCode.LOCKFAILD;
	}
}catch (InterruptedException e){ //抛这个异常意味着,等待获取锁过程中,没到超时时间之前被中断等待。
	// 抛这个异常后,线程中断标志被清除
	Thread.currentThread().interrupt(); //恢复中断标志
	return RetCode.LOCKFAILD;
}finally {
	if(locked)
		lock.unlock();
}

Redisson配置:

@Configuration
public class RedissonConfig {

    @Value("${spring.redis.host:localhost}")
    private String redisHost;

    @Value("${spring.redis.port:6379}")
    private int redisPort;

    @Value("${spring.redis.password:123456}")
    private String password;

    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer()
                .setAddress("redis://" + redisHost + ":" + redisPort)
                .setPassword(password)
                .setConnectionPoolSize(64)
                .setConnectionMinimumIdleSize(10);
        config.setLockWatchdogTimeout(30000L); //看门狗,每隔watchdogTimeout/3(如果线程还活着)进行续期30s
        return Redisson.create(config);
    }
}

时间节点:

拿到锁 → 设过期 30s
          ↓
      10s 后检查线程是否还存活
          ↓
      是 → 再续 30s → 10s 后再检查 → 无限循环
          ↓
      否 → 停止续期,等 30s 后 Redis 自动删 key
          ↓
      业务调了 unlock → 立即停止续期,删 key

注意:tryLock(3, 10, TimeUnit.SECONDS) 一旦指定了 leaseTime(那个 10 秒),Redisson不会启动看门狗,锁到点自动释放。