java通过redis简单实现分布式锁
目录
一、简介
二、代码实现
1、maven添加依赖
2、核心逻辑代码
3、使用方式
三、总结
一、简介
我们知道在Java中可以通过关键字synchronized来防止并发引起的问题,而分布式中就需要考虑分布式锁了,今天来讲一个比较简单的实现,通过redis实现分布式锁,为什么要用redis呢?因为redis很快,还有很多优点,具体可以查看我历史写的文章---------------深入了解Redis:性能、应用场景与常见问题解决方案_redis应用场景及出现的问题-CSDN博客
二、代码实现
1、maven添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
2、核心逻辑代码
/*** 通过redis简单实现分布式锁* @author zengLingYao* @date 2025/8/27 21:16*/
@Component
public class ZengLingYaoService {@Resourcepublic RedisTemplate redisTemplate;/*** 获取锁* 成果获取锁,返回true* 失败返回false* @param key 锁标识用于区分不同锁* @param timeout 有效时间* @param timeUnit 时间单位*/public Boolean tryLock(String key, long timeout, TimeUnit timeUnit){return redisTemplate.opsForValue().setIfAbsent(key, "1", timeout, timeUnit);}/*** 解锁* @param key 锁标识用于区分不同锁*/public void unlock(String key) {redisTemplate.delete(key);}}
3、使用方式
/*** 演示使用分布式锁*/public void zengLingYao(String id) {boolean getLock = zengLingYaoService.tryLock(id, 180, TimeUnit.SECONDS);if (!getLock) {throw new RuntimeException("别人也在操作,你等会再试");}try {// 执行业务逻辑}finally {zengLingYaoService.unlock(id);}}
三、总结
1、setIfAbsent是原子性操作所以不会并发
2、key用来区分不同业务
3、设计过期时间,避免了死锁情况