优秀的编程知识分享平台

网站首页 > 技术文章 正文

Redisson 分布式锁使用(redission分布式锁原理)

nanyue 2024-09-01 00:07:02 技术文章 5 ℃

Redisson是架设在Redis基础上的一个Java驻内存数据网格(In-Memory Data Grid)。 一个基于Redis实现的分布式工具,有基本分布式对象和高级又抽象的分布式服务,为每个试图再造分布式轮子的程序员带来了大部分分布式问题的解决办法。

添加依赖

        <!-- redisson 分布式锁 -->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.16.1</version>
        </dependency>

配置类 RedissionConfig

@Configuration
//@Component
//@ConfigurationProperties(prefix = "spring.redis")
public class RedissionConfig {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.password}")
    private String password;

    @Value("${spring.redis.port}")
    private int port = 6379;

    /**
     * 所有对 redisson 操作都使用 RedissonClient
     * 服务停止自动调用 shutdown 销毁
     * @return
     */
    @Bean(destroyMethod = "shutdown")
    public RedissonClient getRedisson() {
        Config config = new Config();

        if ("".equals(password)) {
            password = null;
        }
        //  单Redis节点模式:必须指定 redis:// 协议,如果启用 SSL连接,需要使用 rediss:// 协议
        config.useSingleServer().
                setAddress("redis://" + redisHost + ":" + port).
                setPassword(password);
        return Redisson.create(config);
    }
}

yml 配置

spring:
  redis:
    database: 0
    host: localhost
    port: 6379
    timeout: 5000
    password:

代码实现

    @Autowired
    private RedissonClient redissonClient;
    /**
     * 加锁简单示例
     * 锁自动续期:如果业务超长,运行期间锁自动续期 默认续期30s,不用担心业务时间长,锁自动被删除。
     * 加锁业务只要完成,就不会给当前锁续期,即使不手动解锁,锁默认在30s以后自动删除。
     * @return
     */

    public String lockTest() {

        String msg = "";
        // 可重入锁,相同的名字(my-lock)代表同一把锁。
        RLock lock = redissonClient.getLock("my-lock");
        try {
            // 枷锁(阻塞式等待,默认加锁30s)
            lock.lock();
            System.out.println("加锁成功 当前线程ID:" + Thread.currentThread().getId());
            System.out.println("执行业务逻辑 当前线程ID:" + Thread.currentThread().getId());

        } finally {
            // 解锁,如果解锁未执行,则不会报错()
            lock.unlock();
            System.out.println("解锁成功 当前线程ID:" + Thread.currentThread().getId());
        }

        return msg;
    }

Tags:

最近发表
标签列表