redis分布式锁 -- 基于redisson实现

1. 总结

1.1 加锁机制

线程去获取锁,获取成功: 执行 lua脚本,保存数据到 redis数据库。

线程去获取锁,获取失败: 一直通过 while循环尝试获取锁,获取成功后,执行 lua脚本,保存数据到 redis数据库。

1.2、watch dog自动延期机制

锁的默认时间是30s,但是看门狗机制会每隔10秒就去验证一下是否已经释放锁,否则就给锁续期

2.配置

2.1引入jar包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.6.2</version>
</dependency>
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.10.6</version>
</dependency>

2.2 yml 配置

server:
  port: 9007
  servlet:
    context-path: /


spring:
  redis:
    # 超时时间
    timeout: 10000ms
    # 服务器地址
    host: 127.0.0.1
    # 服务器端口
    port: 6379
    # 数据库
    database: 0
    # 密码
    password: 123456

    lettuce:
      pool:
        # 最大连接数,默认8
        max-active: 1024
        # 最大连接阻塞等待时间,默认-1
        max-wait: 10000ms
        # 最大空闲连接
        max-idle: 200
        # 最小空闲连接
        min-idle: 5

 3. redissonConfig

public class RedissonConfig {

    @Bean(destroyMethod = "shutdown")
    public RedissonClient redissonClient(RedisProperties redisProperties){
        Config config = new Config();
        SingleServerConfig singleServerConfig = config.useSingleServer();
        singleServerConfig.setAddress("redis://" + redisProperties.getHost() + ":" + redisProperties.getPort());
        singleServerConfig.setPassword(redisProperties.getPassword());
        singleServerConfig.setKeepAlive(true);

        // 根据config创建出RedissonClient实例
        RedissonClient redissonClient = Redisson.create(config);
        return redissonClient;
    }

}

4.lock 加锁

@Resource
private RedissonClient redissonClient;

public void lock() {
        String begin = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        RLock lock = redissonClient.getLock("订单id");
        try {
            lock.lock();
            //lock.lock(4, TimeUnit.SECONDS);
            // 模拟业务处理
            TimeUnit.SECONDS.sleep(50);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
        String end = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        log.info(Thread.currentThread().getName() + "---开始时间:{},, 结束时间{}", begin, end);
    }

5.运行结果:

相关推荐

  1. redis分布式-----基于redisson实现分布式

    2024-04-25 22:58:05       16 阅读
  2. Redis - 分布式Redisson

    2024-04-25 22:58:05       33 阅读
  3. Redisson 实现分布式

    2024-04-25 22:58:05       20 阅读
  4. Redisson实现分布式

    2024-04-25 22:58:05       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-25 22:58:05       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-25 22:58:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-25 22:58:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-25 22:58:05       18 阅读

热门阅读

  1. 智能运维:绘制企业网络管理新脉络

    2024-04-25 22:58:05       14 阅读
  2. 懂蛇语

    2024-04-25 22:58:05       11 阅读
  3. Chrome为什么不用COOKIE

    2024-04-25 22:58:05       11 阅读
  4. python高级进阶(三)[面向对象]

    2024-04-25 22:58:05       11 阅读
  5. MyBatis笔记——参数处理

    2024-04-25 22:58:05       11 阅读