springboot3 redis 实现分布式锁

分布式锁介绍

分布式锁是一种在分布式系统中用于控制不同节点上的进程或线程对共享资源进行互斥访问的技术机制。

在分布式环境中,多个服务可能同时访问和操作共享资源,如数据库、文件系统等。为了保持数据的一致性和完整性,需要确保在同一时刻只有一个服务能够执行写操作。分布式锁就是用来实现这种互斥控制的机制。以下是分布式锁的一些特点和实现方式:

  1. 互斥性:确保同一时刻只有一个线程或进程持有锁,防止并发访问导致的数据不一致问题。

  2. 可重入性:允许同一个节点上的同一个线程在已经获取锁的情况下再次获取锁,而不会导致死锁。

  3. 锁超时:支持锁在一定时间后自动释放,避免因死锁导致的系统瘫痪。

  4. 高可用性:加锁和解锁过程需要高效,并且要保证高可用性,以防止分布式锁失效。

  5. 阻塞和非阻塞性:具备能够在必要时从阻塞状态中被唤醒的能力。

分布式锁的实现方式通常有以下几种:

  1. 基于数据库:通过数据库的行锁或条件乐观锁(版本号)来实现。适用于资源不存在数据库的情况,操作简单易于理解,但性能开销较大,不适合高并发场景。

  2. 基于缓存数据库:如使用Redis实现分布式锁,利用其原子操作和高性能的特点来控制资源的访问。这种方式适合微服务项目中的应用。

  3. 基于文件系统:通过在文件系统中创建锁文件的方式来实现,适用于需要跨进程或跨主机的锁。

  4. 基于ZooKeeper:利用ZooKeeper的顺序临时节点特性来实现分布式锁,适合复杂的分布式系统环境。

本文介绍的是基于redis的分布式锁

引入依赖

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.27.2</version>
</dependency>
package com.solo.platform.common.config;

import lombok.Data;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author: cc
 * @date: 2023/4/09
 * @description:
 */
@Configuration
@ConfigurationProperties(prefix = "spring.data.redis")
@Data
public class RedissonConfig {
    private String host;
    private String port;
    private Integer database;
    private String password;

    /**
     * Redis URI的写法是:redis://[:password@]host[:port][/db-number][?option=value]。
     * <p>
     * 其中:
     * password:可选,用于连接Redis服务器的密码。
     * host:必填,Redis服务器的主机名或IP地址。
     * port:可选,Redis服务器的端口号,默认为6379。
     * db-number:可选,要连接的数据库编号,默认为0。
     * option:可选,连接选项,例如timeout、ssl等。
     *
     * @return
     */
    @Bean
    public RedissonClient redisClient() {
        // 1.创建配置
        Config config = new Config();
        String redisAddress = String.format("redis://:%s@%s:%s/%s", password, host, port, database);
        config.useSingleServer().setAddress(redisAddress);
//                .setDatabase(database);
        // 2.创建实例
        RedissonClient redisson = Redisson.create(config);
        return redisson;
    }

}

  

 // 每个线程都创建自己的锁对象
        // 这是基于 Redis 实现的分布式锁
        Lock lock = this.redissonClient.getLock("userPledgeTaskCalc");
        try {
            // 上锁
            lock.lock();
            // 查询参与质押任务的人
            
            ...业务代码
            //


        } finally {
            // 释放锁
            lock.unlock();
        }

推荐阅读
 

springboot 调用外部接口的21种方式

分布式事务4种实现方式

SpringBoot项目快速启动停止脚本

redis 加强版keydb来了

nginx 就该这么用

Nginx、Kong、Apisix、Gateway网关比较

Spring Cloud Gateway 自定义全局过滤器拦截token

Spring Boot 3.2.0 试用CRaC,启动速度提升3到10倍

Apache 架构师总结的 30 条架构原则

相关推荐

  1. springboot3 redis 实现分布式

    2024-04-14 04:16:02       41 阅读
  2. SpringBoot3+Redis实现分布式

    2024-04-14 04:16:02       22 阅读
  3. springBoot整合Redis(四、整合redis 实现分布式

    2024-04-14 04:16:02       45 阅读
  4. Redis实现分布式

    2024-04-14 04:16:02       46 阅读
  5. Redis分布式实现

    2024-04-14 04:16:02       49 阅读
  6. Redis实现分布式

    2024-04-14 04:16:02       140 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-14 04:16:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-14 04:16:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-14 04:16:02       87 阅读
  4. Python语言-面向对象

    2024-04-14 04:16:02       96 阅读

热门阅读

  1. 【背】蓝桥杯大模板

    2024-04-14 04:16:02       38 阅读
  2. 2024.4.12力扣每日一题——找到冠军 I

    2024-04-14 04:16:02       40 阅读
  3. 2024.4.11力扣每日一题——互质树

    2024-04-14 04:16:02       37 阅读
  4. C语言题目:成绩归类

    2024-04-14 04:16:02       124 阅读
  5. Vector部分底层源码解析

    2024-04-14 04:16:02       48 阅读
  6. Vue 打包或运行时报错Error: error:0308010C

    2024-04-14 04:16:02       209 阅读
  7. RTK高精度定位

    2024-04-14 04:16:02       36 阅读
  8. LeetCode 139. 单词拆分

    2024-04-14 04:16:02       37 阅读
  9. 人工智能技术的创业机遇

    2024-04-14 04:16:02       41 阅读