springboot 中单机 redis 实现分布式锁
在微服务中经常需要使用分布式锁,来执行一些任务。例如定期删除过期数据,在多个服务中只需要一个去执行即可。 以下说明非严格意义的分布式锁,因为 redis 实现严格意义的分布式锁还是比较复杂的,对于日常简单使用使用如下简单方法即可。即偶尔不执行任务不影响业务。 实现要点 1)获得锁、释放锁需要是原子操作。要么获取成功,要么失败。释放要么成功,要么失败 2)任务完成需要自己释放自己的锁,不能释放别人的锁。 3)锁要有过期时间限制,防止任务崩溃没有释放锁,导致其他节点无法获得锁。 4)执行节点超时长时间不释放锁,到下次任务开始执行并行存在的情况 要考虑的风险点 1)获取锁失败,偶尔不执行任务要不影响业务或告警人工干预 2)redis 宕机,导致无法获取锁 方案一:低版本使用 jedis 实现 1 添加依赖,高版本或低版本有些方法可能没有 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>compile</scope></dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.10.2</version><