Spring Boot使用Redis实现分布式锁

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

一、环境准备

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

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

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

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>io.lettuce.core</groupId> <artifactId>lettuce-core</artifactId> </dependency> ​

二、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";
    }
}
​
相关推荐
喜欢敲代码的程序员18 分钟前
SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分离版:项目搭建(一)
spring boot·mysql·elementui·vue·mybatis
阿波罗.201223 分钟前
Zookeeper 客户端 .net访问框架 ZookeeperNetEx项目开发编译
分布式·zookeeper
Bug退退退1231 小时前
RabbitMQ 工作模式
java·分布式·rabbitmq
华子w9089258591 小时前
基于 SpringBoot+Vue.js+ElementUI 的 “花开富贵“ 花园管理系统设计与实现7000字论文
vue.js·spring boot·elementui
暮乘白帝过重山1 小时前
为什么要写RedisUtil这个类
redis·开发·暮乘白帝过重山
小时候的阳光2 小时前
SpringBoot3 spring.factories 自动配置功能不生效?
spring boot·spring·失效·factories·imports
大只鹅3 小时前
Springboot3整合ehcache3缓存--XML配置和编程式配置
spring boot·缓存
执笔诉情殇〆3 小时前
springboot集成达梦数据库,取消MySQL数据库,解决问题和冲突
数据库·spring boot·mysql·达梦
持之以恒的天秤4 小时前
Redis—哨兵模式
redis·缓存
hdsoft_huge4 小时前
Spring Boot 高并发框架实现方案:数字城市的奇妙之旅
java·spring boot·后端