Redis实现分布式锁:setnx

本文介绍了如何使用Redis实现分布式锁,包括SETNX命令的应用及其实现原理。通过代码示例展示了如何利用Redis设置带过期时间的锁,防止死锁的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、概述

分布式锁:控制分布式系统有序的去对共享资源进行操作,通过互斥来保证数据的一致性。
解决方案:
在这里插入图片描述
我这里就只介绍Redis的分布式锁的用法。

2、Redis分布式锁

sexnx (SET if Not Exists) 命令在指定的 key 不存在时,为 key 设置指定的值。
在这里插入图片描述
这种加锁的思路是,如果 key 不存在则为 key 设置 value,如果 key 已存在则 SETNX 命令不做任何操作。

  • 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功
  • 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败
  • 客户端A执行代码完成,删除锁
  • 客户端B在等待一段时间后再去请求设置key的值,设置成功
  • 客户端B执行代码完成,删除锁

代码实现:

// name:key的名称,不同业务用不同的key;
// expire :过期时间,避免出现死锁
// 返回TRUE,则是获取锁成功;FALSE,则是获取失败
public Boolean tryLock(String name, long expire) {
    name = name + "_lock";
    String value = UUID.randomUUID().toString(); // 随机生成一个UUID作为value
    RedisConnectionFactory factory = stringRedisTemplate.getConnectionFactory();
    RedisConnection conn = factory.getConnection();
    try {
        //参考redis命令:
        //set key value [EX seconds] [PX milliseconds] [NX|XX]
        Boolean result = conn.set(
                name.getBytes(),
                value.getBytes(),
                Expiration.from(expire, TimeUnit.MILLISECONDS),
                RedisStringCommands.SetOption.SET_IF_ABSENT);
        if (result != null && result)
            return true;
    } finally {
        RedisConnectionUtils.releaseConnection(conn, factory,false);
    }
    return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TheChainsmokers-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值