文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

spring redis分布式锁怎么实现

2023-10-27 05:13

关注

在Spring中实现Redis分布式锁可以使用RedisTemplate来操作Redis进行加锁和解锁。

首先,我们需要定义一个分布式锁的实体类,包含锁的名称和锁的过期时间:

public class RedisLock {

    private String name; // 锁名称
    private long expireTime; // 锁的过期时间

    // 构造方法和Getter/Setter省略
}

接下来,我们可以创建一个工具类来实现加锁和解锁的逻辑:

@Component
public class RedisLockUtil {

    private static final String LOCK_PREFIX = "redis_lock_"; // 锁的前缀
    private static final long DEFAULT_EXPIRE_TIME = 30000L; // 默认锁的过期时间

    @Autowired
    private RedisTemplate redisTemplate;

    
    public boolean lock(String lockName) {
        String key = LOCK_PREFIX + lockName;
        RedisLock redisLock = new RedisLock(key, DEFAULT_EXPIRE_TIME);
        ValueOperations operations = redisTemplate.opsForValue();
        Boolean absent = operations.setIfAbsent(key, redisLock);
        if (absent != null && absent) {
            return true; // 加锁成功
        }

        // 判断锁是否过期
        RedisLock currentLock = (RedisLock) operations.get(key);
        if (currentLock != null && currentLock.getExpireTime() < System.currentTimeMillis()) {
            RedisLock newLock = new RedisLock(key, DEFAULT_EXPIRE_TIME);
            RedisLock oldLock = (RedisLock) operations.getAndSet(key, newLock);
            if (oldLock != null && oldLock.getExpireTime() < System.currentTimeMillis()) {
                return true; // 加锁成功
            }
        }

        return false; // 加锁失败
    }

    
    public void unlock(String lockName) {
        String key = LOCK_PREFIX + lockName;
        redisTemplate.delete(key);
    }
}

使用示例:

@Service
public class MyService {

    @Autowired
    private RedisLockUtil redisLockUtil;

    public void doSomething() {
        // 加锁
        boolean locked = redisLockUtil.lock("myLock");
        if (locked) {
            try {
                // 执行业务逻辑
            } finally {
                // 解锁
                redisLockUtil.unlock("myLock");
            }
        } else {
            // 加锁失败,处理业务逻辑
        }
    }
}

在以上示例中,`RedisLockUtil`定义了一个`lock`方法来进行加锁操作,使用`setIfAbsent`方法尝试将锁的值存入Redis,如果返回值为true表示加锁成功。如果加锁失败,则判断当前锁是否已经过期,如果过期则使用`getAndSet`方法尝试更新锁的值,并判断返回的旧值是否已经过期,如果过期表示加锁成功。最后,`unlock`方法通过删除锁的键来释放锁。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯