用Redisson实现Redis分布式锁

Redisson是一个在Redis的基础上实现的Java驻留(in-memory)数据网格(Data Grid)。它提供了许多分布式Java对象和服务,包括分布式锁、分布式集合、分布式原子类等。使用Redisson可以简化Redis分布式锁的实现。

以下是一个使用Redisson实现Redis分布式锁的Java示例:

首先,确保你已经添加了Redisson的的依赖到你的项目中。如果你使用Maven,可以在pom.xml文件中添加以下依赖:

<dependency>  
    <groupId>org.redisson</groupId>  
    <artifactId>redisson</artifactId>  
    <version>3.15.6</version> <!-- 请检查并使用最新版本 -->  
</dependency>

然后,配置Redisson客户端:

import org.redisson.Redisson;  
import org.redisson.api.RedissonClient;  
import org.redisson.config.Config;  
  
public class RedissonClientConfig {  
  
    public static RedissonClient createRedissonClient() {  
        Config config = new Config();  
        config.useSingleServer()  
              .setAddress("redis://127.0.0.1:6379"); // 设置你的Redis服务器地址  
  
        return Redisson.create(config);  
    }  
}

现在,使用Redisson实现分布式锁:

import org.redisson.api.RLock;  
import org.redisson.api.RedissonClient;  
  
public class RedissonDistributedLock {  
  
    private final RedissonClient redissonClient;  
  
    public RedissonDistributedLock(RedissonClient redissonClient) {  
        this.redissonClient = redissonClient;  
    }  
  
    /**  
     * 尝试获取分布式锁  
     * @param lockKey 锁的名称  
     * @return 是否获取成功  
     */  
    public boolean tryGetLock(String lockKey) {  
        RLock lock = redissonClient.getLock(lockKey);  
        // 最常见的使用方法  
        // lock.lock();  
        // 尝试加锁,最多等待10秒,上锁以后10秒钟自动解锁  
        boolean res = lock.tryLock(10, 10, TimeUnit.SECONDS);  
        return res;  
    }  
  
    /**  
     * 释放分布式锁  
     * @param lockKey 锁的名称  
     */  
    public void releaseLock(String lockKey) {  
        RLock lock = redissonClient.getLock(lockKey);  
        lock.unlock();  
    }  
  
    public static void main(String[] args) {  
        RedissonClient redissonClient = RedissonClientConfig.createRedissonClient();  
        RedissonDistributedLock lock = new RedissonDistributedLock(redissonClient);  
  
        String lockKey = "myRedissonLock";  
        if (lock.tryGetLock(lockKey)) {  
            try {  
                // 成功获取锁,执行业务代码  
                System.out.println("Acquired lock, doing some work...");  
                // 模拟耗时操作  
                Thread.sleep(5000);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            } finally {  
                // 释放锁  
                lock.releaseLock(lockKey);  
                System.out.println("Lock released.");  
            }  
        } else {  
            // 获取锁失败  
            System.out.println("Failed to acquire lock.");  
        }  
  
        // 关闭Redisson客户端连接  
        redissonClient.shutdown();  
    }  
}

在这个示例中,我们首先创建了一个RedissonClient实例,它是与Redis服务器通信的主要接口。然后,我们定义了一个RedissonDistributedLock类,它封装了获取和释放锁的逻辑。

tryGetLock方法尝试获取锁,如果锁当前被其他客户端持有,它会等待最多10秒,如果10秒内获得了锁,则方法返回true,否则返回false。锁在成功获取后的10秒内会自动释放。

releaseLock方法用于释放锁。在业务代码执行完毕后,应该总是确保调用此方法以释放锁,即使发生异常也是如此。

main方法中,我们创建了一个RedissonDistributedLock实例,并尝试获取锁。如果成功获取,则执行一些业务逻辑,并在完成后释放锁。最后,我们关闭了RedissonClient实例以释放资源。

请注意,上述示例仅用于教学目的,实际使用时你需要根据自己的需求来调整锁的超时时间、重试策略等参数。此外,确保Redis服务器已经正确配置并运行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

糯米小麻花啊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值