Redisson获取分布式锁

1. maven

  <!-- redisson 分布式锁 -->
  <dependency>
      <groupId>org.redisson</groupId>
      <artifactId>redisson</artifactId>
      <version>3.11.2</version>
</dependency>

2. redisson客户端配置类

package com.harara.redis;

import com.montnets.common.util.StringUtil;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

/**
 * @author: harara
 * @date: 2019-11-05 19:58
 * @description:  redisson客户端配置类
 * @version: 1.0
 */
@Configuration
@Component
public class RedissonManager {

    /**redis集群节点*/
    private String cluster;

    /**redis密码*/
    private String password;

    /**redis 单节点ip*/
    private String host;

    /**redis单节点端口*/
    private String port;

    /**最大连接数*/
    private int maxPoolSize;

    @Bean
    public RedissonClient getRedissonClient(){
        return loadRedisson();
    }

    public RedissonClient loadRedisson(){
        RedissonClient client = null;
        Config config = new Config();
        //单节点
        if (!StringUtil.isEmpty(host)) {
            config.useSingleServer().
                    setAddress("redis://" + host + ":" + port)
//                    .setPassword(password)
                    .setConnectionPoolSize(maxPoolSize)
                    //最小空闲连接
                    .setConnectionMinimumIdleSize(0);
            //如果密码不为空,设置密码
            if(!StringUtil.isEmpty(password)){
                config.useSingleServer().setPassword(password);
            }
            client = Redisson.create(config);
        } else {
            //集群节点
            String[] nodes = cluster.split(",");
            //redisson版本是3.5,集群的ip前面要加上“redis://”,不然会报错,3.2版本可不加
            for (int i = 0; i < nodes.length; i++) {
                nodes[i] = "redis://" + nodes[i];
            }
            //这是用的集群server
            config.useClusterServers()
                    //设置集群状态扫描时间2000
                    .setScanInterval(2000)
                    .addNodeAddress(nodes)
//                    .setPassword(password)
                    .setMasterConnectionPoolSize(maxPoolSize)
                    //最小空闲连接
                    .setMasterConnectionMinimumIdleSize(0);
            //如果密码不为空,设置集群密码
            if (!StringUtil.isEmpty(password)) {
                config.useClusterServers().setPassword(password);
            }
            client = Redisson.create(config);
//            System.out.println(config.);
            //可通过打印redisson.getConfig().toJSON().toString()来检测是否配置成功
        }
        return client;
    }
}

3.获取锁类(加锁,解锁)

package com.montnets.ums.msgroute.redis;

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

import java.util.concurrent.TimeUnit;

/**
 * @author: chenly
 * @date: 2019-11-05 20:29
 * @description: 获取redisson分布式锁类
 * @version: 1.0
 */
@Component
@Slf4j
public class RedissonDistributedLocker {

    @Autowired
    private RedissonClient redissonClient;

    /**
     * lock(),拿不到lock就不罢休,不然线程就一直block
     * @param lockKey
     * @return
     */
    public RLock lock(String lockKey){
        RLock lock = redissonClient.getLock(lockKey);
        lock.lock();
        return lock;
    }

    /**
     * leaseTime为加锁时间,单位为秒
     * @param lockKey  锁的名称
     * @param leaseTime 加锁时间,单位秒
     * @return
     */
    public RLock lock(String lockKey,long leaseTime){
        RLock lock = redissonClient.getLock(lockKey);
        lock.lock(leaseTime, TimeUnit.SECONDS);
        return lock;
    }

    /**
     * leaseTime为加锁时间,单位为秒
     * @param lockKey 锁的名称
     * @param unit  时间单位
     * @param leaseTime  加锁时间
     * @return
     */
    public RLock lock(String lockKey,TimeUnit unit,long leaseTime){
        RLock lock = redissonClient.getLock(lockKey);
        lock.lock(leaseTime,unit);
        return lock;
    }

    /**
     * 加锁
     * tryLock(),马上返回,拿到lock就返回true,不然返回false。
     * 带时间限制的tryLock(),拿不到lock,就等一段时间,超时返回false.
     * @param lockKey 锁的名称
     * @param unit   单位名称
     * @param waitTime  等待时间
     * @param leaseTime 加锁时间
     * @return
     */
    public boolean tryLock(String lockKey,TimeUnit unit,long waitTime,long leaseTime){
        RLock lock = redissonClient.getLock(lockKey);
        try{
            lock.tryLock(waitTime,leaseTime,unit);
            return true;
        }catch (InterruptedException e){
            return false;
        }
    }

    /**
     *
     * 带时间限制的tryLock(),拿不到lock,就等一段时间,超时返回false.
     * @param lockKey
     * @param waitTime
     * @return
     */
    public boolean tryLock(String lockKey,long waitTime,TimeUnit unit){
        RLock rLock = redissonClient.getLock(lockKey);
        try{
            rLock.tryLock(waitTime,unit);
            return true;
        }catch (InterruptedException e){
            return false;
        }
    }

    /**
     * 解锁
     * @param lockKey  锁的名称
     */
    public void unlock(String lockKey){
        RLock lock = redissonClient.getLock(lockKey);
        lock.unlock();
    }

    /**
     * 解锁
     * @param lock 锁
     */
    public void unlock(RLock lock){
        lock.unlock();
    }
}

原文地址:https://www.cnblogs.com/kiko2014551511/p/11801640.html

时间: 2024-11-08 14:50:45

Redisson获取分布式锁的相关文章

使用Redisson实现分布式锁,Spring AOP简化之

源码 Redisson概述 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务.其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publi

Redisson实现分布式锁—RedissonLock

Redisson实现分布式锁-RedissonLock 有关Redisson实现分布式锁上一篇博客讲了分布式的锁原理:Redisson实现分布式锁---原理 这篇主要讲RedissonLock和RLock.Redisson分布式锁的实现是基于RLock接口,RedissonLock实现RLock接口. 一.RLock接口 1.概念 public interface RLock extends Lock, RExpirable, RLockAsync 很明显RLock是继承Lock锁,所以他有Lo

利用Redisson实现分布式锁及其底层原理解析

Redis介绍 参考地址:https://blog.csdn.net/turbo_zone/article/details/83422215 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此

【高并发】你知道吗?大家都在使用Redisson实现分布式锁了!!

写在前面 忘记之前在哪个群里有朋友在问:有出分布式锁的文章吗-@冰河?我的回答是:这周会有,也是[高并发]专题的.想了想,还是先发一个如何使用Redisson实现分布式锁的文章吧?为啥?因为使用Redisson实现分布式锁简单啊!Redisson框架是基于Redis实现的分布式锁,非常强大,只需要拿来使用就行了,至于分布式锁的原理啥的,后面再撸一篇文章就是了. Redisson框架十分强大,基于Redisson框架可以实现几乎你能想到的所有类型的分布式锁.这里,我就列举几个类型的分布式锁,并各自

redisson实现分布式锁原理

Redisson分布式锁 之前的基于注解的锁有一种锁是基本redis的分布式锁,锁的实现我是基于redisson组件提供的RLock,这篇来看看redisson是如何实现锁的. 不同版本实现锁的机制并不相同 引用的redisson最近发布的版本3.2.3,不同的版本可能实现锁的机制并不相同,早期版本好像是采用简单的setnx,getset等常规命令来配置完成,而后期由于redis支持了脚本Lua变更了实现原理. <dependency> <groupId>org.redisson&

Java之——redis并发读写锁,使用Redisson实现分布式锁

原文:http://blog.csdn.net/l1028386804/article/details/73523810 1. 可重入锁(Reentrant Lock) Redisson的分布式可重入锁RLock Java对象实现了java.util.concurrent.locks.Lock接口,同时还支持自动过期解锁. [java] view plain copy public void testReentrantLock(RedissonClient redisson){ RLock lo

redisson spring boot starter 做分布式锁

使用redisson做分布式锁 分布式锁 在java中单体应用中,我们如果想要保证一个接口或者服务.方法当下只有一个线程在运行,我们可以通过JDK提供的Lock.Semaphore.同步锁等多种方式实现只有一个线程在运行. 在微服务系统中,我们的单体应用会变成多个节点,只靠JDK本身的锁只能控制一个节点的运行,所以我们需要一个可以控制全局的锁来控制系统的运行,这就是所谓的分布式锁. Zk redis 等中间件都可以做分布式锁,优缺点也各不相同,在我们现在的系统中zk的直接操作还是比较少,更多的是

Redisson 分布式锁超简封装

Redisson是一个在Redis的基础上实现的Java驻内存数据网格.它几乎提供了Redis所有工具,不仅封装Redis底层数据结构,而且还提供了很多Java类型映射.Redisson支持redis单实例.redis哨兵.redis cluster.redis master-slave等各种部署架构.Redisson除了普通分布式锁还支持 联锁(MultiLock),读写锁(ReadWriteLock),公平锁(Fair Lock),红锁(RedLock),信号量(Semaphore),可过期

springboot整合redisson分布式锁

一.通过maven引入redisson的jar包 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.6.5</version> </dependency> 二.在yaml文件中引入redis的相关配置(redis单节点可以读取原有redis配置拼装,如果是主从需另外独立配置,相关属性