当前位置: 首页 > article >正文

【Redisson分布式锁】基于redisson的分布式锁

redisson分布式锁
maven文件:

        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.15.3</version>
        </dependency>

实现代码:
分布式锁对象参数(DistributedLock):

import lombok.Data;

import java.util.concurrent.TimeUnit;

/**
 * 分布式锁对象参数
 */
@Data
public class DistributedLock {
    /**
     * 锁用的key
     */
    private String lockKey;
    /**
     * 等待(尝试)时间,默认3秒
     */
    private long waitTime=3;
    /**
     *加锁的时间,默认20秒
     */
    private long lockTime=20;
    /**
     * 时间单位:默认秒
     */
    private TimeUnit timeUnit= TimeUnit.SECONDS;
}

配置:LockAutoConfig

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "com.xxx.commons.rlockstater")
public class LockAutoConfig {
    @Bean
    public DistributedLockService distributedLockService(){
        return new DistributedLockServiceImpl();
    }
}

DistributedLockService

import org.redisson.api.RLock;

public interface DistributedLockService {

    /**
     * 获取锁
     * @param distributedLock 分布式锁对象参数
     * @return boolean
     */
    public boolean tryLock(DistributedLock distributedLock);

    /**
     * 解(释放)锁
     * @param distributedLock 分布式锁对象参数
     */
    public void unlock(DistributedLock distributedLock);
    /**
     * 解(释放)锁
     * @param lockKey 锁的key值
     */
    public void unlock(String lockKey);

    /**
     * 解(释放)锁
     * @param lock 锁对象
     */
    public void unlock(RLock lock);
}

实现:
DistributedLockServiceImpl:

import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;

@Slf4j
public class DistributedLockServiceImpl implements DistributedLockService {
    /**
     * 默认的LockKey前缀
     */
    private static final String LOCK_KEY_PREFIX = "tincere:rlock";
    private RedissonClient redissonClient;

    @Autowired
    public void setRedissonClient(RedissonClient redissonClient) {
        this.redissonClient = redissonClient;
    }

    @Override
    public boolean tryLock(DistributedLock distributedLock) {
        try {
            RLock lock = redissonClient.getLock(LOCK_KEY_PREFIX + distributedLock.getLockKey());
            return lock.tryLock(distributedLock.getWaitTime(), distributedLock.getLockTime(), distributedLock.getTimeUnit());
        } catch (Exception e) {
            log.error("获取分布式锁异常", e);
        }
        return false;
    }

    @Override
    public void unlock(DistributedLock distributedLock) {
        RLock lock = redissonClient.getLock(LOCK_KEY_PREFIX + distributedLock.getLockKey());
        unlock(lock);
    }

    @Override
    public void unlock(String lockKey) {
        RLock lock = redissonClient.getLock(LOCK_KEY_PREFIX + lockKey);
        unlock(lock);
    }

    @Override
    public void unlock(RLock lock) {
        if(!lock.isLocked()||!lock.isHeldByCurrentThread()){
            log.error("当前Key{}不存在或者不是当前线程持有",lock.getName());
            return;
        }
        lock.unlock();
    }
}


http://www.kler.cn/a/535661.html

相关文章:

  • 确保数据一致性:RabbitMQ 消息传递中的丢失与重复问题详解
  • Text2Sql:开启自然语言与数据库交互新时代(3030)
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter2-HTML 中的 JavaScript
  • 汇编JCC条件跳转指令记忆
  • 【初/高中生讲机器学习】0. 本专栏 “食用” 指南——写在一周年之际⭐
  • 修剪二叉搜索树(力扣669)
  • 在 Vue Router 中,params和query的区别?
  • 使用EVE-NG实现VLAN
  • 绿联NAS安装cpolar内网穿透工具实现无公网IP远程访问教程
  • Vue.js 中 computed 和 watch 的使用场景
  • LangGraph中的Human-in-the-loop技术(GPT-4o 回答)
  • 园区网设计与实战
  • Oracle(windows安装遇到的ORA-12545、ORA-12154、ORA-12541、ORA-12514等问题)
  • Redis bitmap应用
  • MySQL中json类型数据查询
  • 【自然语言处理】TextRank 算法提取关键词(Python实现)
  • Java面试题简答(整理)
  • gitlab个别服务无法启动可能原因
  • 图解BWT(Burrows-Wheeler Transform) 算法
  • [Java基础]函数式编程
  • java面试题高级_Java高级面试题整理(附答案)
  • 【C语言】指针运算与数 组关系:详细分析与实例讲解
  • CSS实现自适应的正方形
  • C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输
  • 【Linux】25.进程信号(1)
  • GGML、GGUF、GPTQ 都是啥?