首页 > 其他分享 >分布式锁实现

分布式锁实现

时间:2024-09-24 10:22:31浏览次数:10  
标签:String 实现 lock springframework org import public 分布式

        在 Spring Boot 项目中,实现分布式锁可以通过多种方式,常见的有使用 Redis、数据库等。以下是通过 Redis 和数据库两种方式来实现分布式锁的示例。

1、使用 Redis 实现分布式锁

        Redis 提供了简单且高效的分布式锁机制。可以使用 SETNX 命令(setIfAbsent())来实现锁的获取和释放。 

锁类

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component
public class RedisLock {
    private final RedisTemplate<String, String> redisTemplate;

    public RedisLock(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public boolean acquireLock(String lockKey, long timeout, TimeUnit unit) {
        Boolean success = redisTemplate.opsForValue().setIfAbsent(lockKey, "locked");
        if (Boolean.TRUE.equals(success)) {
            redisTemplate.expire(lockKey, timeout, unit);
        }
        return success != null && success;
    }

    public void releaseLock(String lockKey) {
        redisTemplate.delete(lockKey);
    }
}

使用示例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LockController {

    @Autowired
    private RedisLock redisLock;

    @GetMapping("/critical-section")
    public String criticalSection() {
        String lockKey = "my_lock";
        if (redisLock.acquireLock(lockKey, 10, TimeUnit.SECONDS)) {
            try {
                // 业务逻辑
            } finally {
                redisLock.releaseLock(lockKey);
            }
        } else {
            return "没有获取到锁,资源正在使用。";
        }
    }
}

2、使用数据库实现分布式锁 

        如果使用关系型数据库,可以通过表记录来实现分布式锁。 

创建锁表 

CREATE TABLE distributed_lock (
    lock_name VARCHAR(255) PRIMARY KEY,
    locked BOOLEAN NOT NULL,
    lock_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

锁类 

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class DatabaseLock {
    private final JdbcTemplate jdbcTemplate;

    public DatabaseLock(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public boolean acquireLock(String lockName) {
        int rowsAffected = jdbcTemplate.update("INSERT INTO distributed_lock (lock_name, locked) VALUES (?, ?)", lockName, true);
        return rowsAffected > 0;
    }

    public void releaseLock(String lockName) {
        jdbcTemplate.update("DELETE FROM distributed_lock WHERE lock_name = ?", lockName);
    }
}

使用示例 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LockController {

    @Autowired
    private DatabaseLock databaseLock;

    @GetMapping("/critical-section")
    public String criticalSection() {
        String lockName = "my_lock";
        if (databaseLock.acquireLock(lockName)) {
            try {
                // 业务逻辑
            } finally {
                databaseLock.releaseLock(lockName);
            }
        } else {
            return "没有获取到锁,资源正在被使用。";
        }
    }
}

        Redis 通常更适用于高性能的分布式环境,而数据库锁更容易集成到已有的数据库系统中。 

标签:String,实现,lock,springframework,org,import,public,分布式
From: https://blog.csdn.net/qq_53793319/article/details/142482555

相关文章

  • 在 Go 语言中使用 Redis 实现分布式锁
    目录在Go语言中使用Redis实现分布式锁一、分布式锁的概念和作用二、Redis实现分布式锁的原理三、在Go语言中使用Redis实现分布式锁的步骤(一)安装Redis客户端库(二)定义分布式锁结构体(三)实现获取锁的方法(四)实现释放锁的方法(五)使用分布式锁四、注意事项五、总......
  • sync.Map的实现原理
    在Go语言中,sync.Map是一个并发安全的映射结构,专门用于在高并发场景下处理键值对数据。它的并发安全是通过内部实现机制来保证的,而不是依赖外部的锁机制(如sync.Mutex或sync.RWMutex)来手动保护操作。sync.Map并发安全的实现原理sync.Map采用了一种更复杂的数据结构和操作......
  • 【JS】Object.defineProperty与Proxy的对比并通过Vue2、3的实现证明Proxy性能优于Obje
    一、Object.defineProperty这里只是简单描述,具体请看另一篇文章:Object.defineProperty。Object.defineProperty是JavaScript中用于定义或修改对象属性的功能强大的方法。它可以精确地控制属性的行为,如是否可枚举、可配置、可写等。基本用法Object.defineProperty(obj......
  • 实现高效物联网通信:MQTT协议深入解析
    MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,最初由IBM于1999年开发,目的是为了监控远程设备的传感器和嵌入式系统之间的通信。它的目标是提供一种简单、高效、可靠的消息传递机制,以满足低带宽、不稳定网络环境下的通信需求。MQTT是适用于物联网的最佳协议M......
  • vue实现点击按钮发出警报声
    Vue的音乐文件夹叫做assets,assets文件夹在Vue项目的根目录下。assets文件夹用于存放项目中使用的静态资源文件,包括图片、音乐、视频等。在assets文件夹中,可以创建一个单独的文件夹用于存放音乐文件,命名可根据需要自定义,一般而言命名为music或audio。音频文件:在这里免费下载  h......
  • EfficientFormer实战:使用EfficientFormerV2实现图像分类任务(一)
    摘要EfficientFormerV2是一种通过重新思考ViT设计选择和引入细粒度联合搜索策略而开发出的新型移动视觉骨干网络。它结合了卷积和变换器的优势,通过一系列高效的设计改进和搜索方法,实现了在移动设备上既轻又快且保持高性能的目标。这一成果为在资源受限的硬件上有效部署视觉......
  • Java实现加法计算器
    今天我们来做一个Java中的方法的小练习:建立一个方法,去实现加法运算。代码实现importjava.util.Scanner;publicclassmethod01{ publicstaticvoidmain(String[]args){ Scannersc=newScanner(System.in); doubleinputNumber1=0.0; doubleinputNumber2=0.0......
  • EfficientFormer实战:使用EfficientFormerV2实现图像分类任务(二)
    文章目录训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法运行以及结果查看测试完整的代码在上一篇文章中完成了......
  • 数据结构-线性表的单链式存储结构图解及C语言实现
    概念链式存储:结点在存储器中的位置是任意的,即逻辑相邻的数据元素在物理上不一定相邻链式存储结构也称非顺序映像或链式映像图解链式存储结构中结点一般有两个部分组成,即数据域(data)和指针域,数据域是用于存放数据的,指针域是用来指向下一结点的地址的,其中头节点指向该链表......
  • RAG技术全面解析:Langchain4j如何实现智能问答的跨越式进化?
    LLM的知识仅限于其训练数据。如希望使LLM了解特定领域的知识或专有数据,可:使用本节介绍的RAG使用你的数据对LLM进行微调结合使用RAG和微调1啥是RAG?RAG是一种在将提示词发送给LLM之前,从你的数据中找到并注入相关信息的方式。这样,LLM希望能获得相关的信息并利用......