使用 Redisson 、Redis实现分布式锁

Redisson 是基于 Redis 实现的一个 Java 框架,为开发者提供了更方便、更高级的 API 和功能。

Redisson 优点:

  1. 简单易用的 API:简化了 Redis 操作的代码编写,使开发者能够更专注于业务逻辑。

  2. 分布式特性支持:如分布式锁、分布式集合等,方便在分布式环境中进行协调和数据共享。

  3. 连接管理:处理与 Redis 服务器的连接建立、断开和连接池管理。

例子:

添加 Redisson 依赖

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.17.6</version>
</dependency>

 代码:

import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

import java.util.concurrent.TimeUnit;

public class DistributedLockExample {

    public static void main(String[] args) {
        // 创建 Redisson 配置
        Config config = new Config();
        config.useSingleServer().setAddress("redis://localhost:6379");

        // 创建 Redisson 客户端
        RedissonClient redisson = Redisson.create(config);

        String lockKey = "myDistributedLock";

        // 获取分布式锁
        RLock lock = redisson.getLock(lockKey);

        try {
            // 尝试获取锁,超时时间为 10 秒
            boolean isAcquired = lock.tryLock(10, TimeUnit.SECONDS);

            if (isAcquired) {
                // 获得锁后执行的操作
                System.out.println("Acquired the lock. Performing critical section operations...");
                // 模拟耗时操作
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                System.out.println("Failed to acquire the lock.");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            // 释放锁
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }

        // 关闭 Redisson 客户端
        redisson.shutdown();
    }
}

代码讲解:

  1. 首先创建了 Redisson 的配置,并指定 Redis 服务器的地址。
  2. 通过配置创建了 Redisson 客户端。
  3. 定义了一个锁的键 lockKey 。
  4. 使用 redisson.getLock(lockKey) 获取锁对象。
  5. 通过 lock.tryLock(10, TimeUnit.SECONDS) 尝试在 10 秒内获取锁。
  6. 如果获取到锁,进行相关操作,操作完成后释放锁。

如果在使用 Redisson 尝试获取分布式锁时没有成功获取到锁,那么相关的代码逻辑将不会执行锁保护的关键操作部分。

在上述示例中,如果 lock.tryLock(10, TimeUnit.SECONDS) 未能在指定的 10 秒内获取到锁,isAcquired 将为 false ,随后的 if (isAcquired) 条件内的操作将不会被执行,而是会输出 Failed to acquire the lock. 。

这可以避免多个并发进程或线程同时执行受锁保护的关键操作,确保数据的一致性和正确性。在实际应用中,如果没有获取到锁,您可以根据具体的业务需求进行不同的处理,例如等待一段时间后重试获取锁,或者直接执行其他非关键的操作或者返回错误信息给用户等。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值