redis分布式锁

redis在spring 配置

  • jar包引入
        <!--版本号和spring parent版本号一致-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
  • 配置
package com.itllc.config.RedisConfig;

import org.apache.commons.lang3.StringUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
@EnableCaching
public class RedissonConfig {
    @Value("${spring.redis.host}")
    String REDIS_HOST;

    @Value("${spring.redis.port}")
    String REDIS_PORT;

    @Value("${spring.redis.password}")
    String REDIS_PASSWORD;

    @Value("${spring.redis.database}")
    int REDIS_DATABASE;

    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        SingleServerConfig r = config.useSingleServer();
        r.setAddress("redis://" + REDIS_HOST + ":" + REDIS_PORT)
                .setDatabase(REDIS_DATABASE)
                .setConnectionMinimumIdleSize(5)
                .setConnectionPoolSize(10);
        if (!StringUtils.isEmpty(REDIS_PASSWORD)) {
            r.setPassword(REDIS_PASSWORD);
        }
        return Redisson.create(config);
    }

}
package com.itllc.config.RedisConfig;

import org.apache.commons.lang3.StringUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
@EnableCaching
public class RedissonConfig {
    @Value("${spring.redis.host}")
    String REDIS_HOST;

    @Value("${spring.redis.port}")
    String REDIS_PORT;

    @Value("${spring.redis.password}")
    String REDIS_PASSWORD;

    @Value("${spring.redis.database}")
    int REDIS_DATABASE;

    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        SingleServerConfig r = config.useSingleServer();
        r.setAddress("redis://" + REDIS_HOST + ":" + REDIS_PORT)
                .setDatabase(REDIS_DATABASE)
                .setConnectionMinimumIdleSize(5)
                .setConnectionPoolSize(10);
        if (!StringUtils.isEmpty(REDIS_PASSWORD)) {
            r.setPassword(REDIS_PASSWORD);
        }
        return Redisson.create(config);
    }

}

redis 分布式锁

package com.itllc.aop;

import lombok.Getter;
import lombok.Setter;
import org.redisson.api.RLock;

/**
 * @description 加锁结果类封装了加锁状态和RLock。
 *
 * @author lilinchun
 * @date 2023/06/28
 */
@Setter
@Getter
public class LockResult {

    private LockResultStatus lockResultStatus;

    private RLock rLock;

}

package com.itllc.aop;

/**
 * @description 加锁结果状态枚举类
 *
 * @author lilinchun
 * @date 2023/06/28
 */
public enum  LockResultStatus {

    /**
     * 通信正常,并且加锁成功
     */
    SUCCESS,
    /**
     * 通信正常,但获取锁失败
     */
    FAILURE,
    /**
     * 通信异常和内部异常,锁状态未知
     */
    EXCEPTION;

}

  • 测试示例
  @GetMapping(value = "/redisLock")
    @ApiOperation("使用redis锁")
    public Result<Boolean> useRedis(@NotBlank @ApiParam(value = "用户信息", required = true) @RequestParam("userId") String userId) {
        return new Result<>(redisService.useRedis(userId));
    }
// ——————————————————————————————————————————————————————
   @Resource
    private LockManager lockManager;

    public Boolean useRedis(String userId) {
        // 锁:userId, 锁超时时间:5s, 锁等待时间:50ms
        LockResult lockResult = lockManager.lock(userId, 5000, 1000);
        try {
            //  业务代码
            System.out.println("执行业务2s!!!!!");
            Thread.sleep(2000);
            System.out.println("执行业务完成!!!!!");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            lockManager.unlock(lockResult.getRLock());
        }
        return true;
    }
  • 测试工具 Jmeter
    并发同时请求一个参数

在这里插入图片描述
在这里插入图片描述
并发请求不同的参数
在这里插入图片描述
在这里插入图片描述
总结:两次测试结果说明redis的锁生效了,并且有效的解决了分布式事务的问题
注意:
解锁方式

  if(lock.isLocked() && lock.isHeldByCurrentThread()){
                lock.unlock();//解锁
            }

不然会出现问题,自己加的锁自己解锁,还需要判断加锁是否成功了
问题文章:https://blog.csdn.net/xiyang_1990/article/details/119876496

使用注解实现redis锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱上编程2705

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值