Spring Boot使用Redis实现分布式锁

在分布式系统中,分布式锁是一种解决并发问题的常用技术。Redis由于其高性能和丰富的特性,成为实现分布式锁的理想选择。本文将详细介绍如何在Spring Boot应用中使用Redis实现分布式锁。

一、环境准备

  1. 安装Redis:确保已经安装并运行Redis服务。

  2. Spring Boot项目:确保已经创建并配置好了Spring Boot项目。

  3. 添加依赖 :在 pom.xml中添加Spring Data Redis和Lettuce依赖。

    org.springframework.boot spring-boot-starter-data-redis io.lettuce.core lettuce-core

二、Redis配置

application.propertiesapplication.yml文件中配置Redis连接信息。

复制代码
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=yourpassword # 如果Redis设置了密码
​

三、实现分布式锁

1. 创建Redis配置类
复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

@Configuration
public class RedisConfig {

    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
        return new StringRedisTemplate(factory);
    }

    @Bean
    public ValueOperations<String, String> valueOperations(StringRedisTemplate stringRedisTemplate) {
        return stringRedisTemplate.opsForValue();
    }
}
​
2. 创建分布式锁工具类
复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component
public class RedisLock {

    @Autowired
    private ValueOperations<String, String> valueOperations;

    private static final long LOCK_EXPIRE = 30L; // 锁过期时间,30秒
    private static final String LOCK_VALUE = "LOCKED";

    public boolean lock(String key) {
        Boolean success = valueOperations.setIfAbsent(key, LOCK_VALUE, LOCK_EXPIRE, TimeUnit.SECONDS);
        return success != null && success;
    }

    public void unlock(String key) {
        valueOperations.getOperations().delete(key);
    }
}
​
3. 使用分布式锁
复制代码
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("/lock")
    public String lock() {
        String key = "myLock";
        if (redisLock.lock(key)) {
            try {
                // 业务逻辑
                Thread.sleep(2000); // 模拟业务处理时间
                return "Locked and processed";
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } finally {
                redisLock.unlock(key);
            }
        } else {
            return "Failed to acquire lock";
        }
        return "Unexpected error";
    }
}
​
相关推荐
独泪了无痕2 小时前
SpringBoot Event事件机制,轻松实现业务解耦
spring boot·后端·spring
悲且狂3 小时前
SpringBoot项目改造注意事项(旧项目框架复用)
java·spring boot·后端
接着奏乐接着舞。4 小时前
【2026】73道Redis 常见面试题与参考答案
数据库·redis·后端·缓存
夫唯不争,故无尤也5 小时前
分布式训练全栈地图
分布式·ddp·fsdp·ray·verl
国科安芯6 小时前
星载CAN总线通信网络中抗辐射MCU的通信可靠性设计分析
网络·人工智能·分布式·单片机·嵌入式硬件·架构
ApacheSeaTunnel7 小时前
用 Apache SeaTunnel 同步 DynamoDB 到 Redis,一个配置文件就够
redis·开源·seatunnel·数据同步·dynamodb
SQL-First布道者8 小时前
⚡Spring JDBC 完整体系 · 第 10 集 · 手搓 `BaseCondition`
java·spring boot·后端·spring·mybatis·spring jdbc
2601_962074688 小时前
Spring Boot的无缝衔接:深入解析与实践
数据库·spring boot·后端
南城以南溫暖如初1478 小时前
社交裂变商城系统设计与实战开发指南
java·spring boot·mysql·vue·mybatis
xiaoqiMikko8 小时前
Spring 官方给 5.3 线开了三个修复版,Maven Central 上一个都没有
java·spring boot