高性能分布式锁-redisson的使用

Posted webwangbao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高性能分布式锁-redisson的使用相关的知识,希望对你有一定的参考价值。

1,概述:在一些高并发的场景中,比如秒杀,抢票,抢购这些场景,都存在对核心资源,商品库存的争夺,控制不好,库存数量可能被减少到负数,出现超卖的情况,或者 产生唯一的一个递增ID,由于web应用部署在多个机器上,简单的同步加锁是无法实现的,给数据库加锁的话,对于高并发,1000/s的并发,数据库可能由行锁变成表锁,性能下降会厉害。那相对而言,redis的分布式锁,相对而言,是个很好的选择,redis官方推荐使用的Redisson就提供了分布式锁和相关服务。 
下面介绍下如何使用Redisson。

2,Redisson的使用方式十分简单,详见官方文档:https://github.com/redisson/redisson/wiki/2.-%E9%85%8D%E7%BD%AE%E6%96%B9%E6%B3%95

3,加入jar包的依赖:

<dependency>
        <groupId>org.redisson</groupId>
        <artifactId>redisson</artifactId>
         <version>2.7.0</version> 
 </dependency>

4,配置Redisson

public class RedissonManager {
    private static Config config = new Config();
    //声明redisso对象
    private static Redisson redisson = null;
   //实例化redisson
   public static void init(String key,String value){
        try {
          //使用单机版配置
          config.useSingleServer().setAddress("127.0.0.1:6379");
          //得到redisson对象
            redisson = (Redisson) Redisson.create(config);
           
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //获取redisson对象的方法
    public static Redisson getRedisson(){
        return redisson;
    }
}

 

5,锁的获取和释放

public class DistributedRedisLock {
   //从配置类中获取redisson对象
    private static Redisson redisson = RedissonManager.getRedisson();
    private static final String LOCK_TITLE = "redisLock_";
   //加锁
    public static boolean acquire(String lockName){
       //声明key对象
        String key = LOCK_TITLE + lockName;
       //获取锁对象
        RLock mylock = redisson.getLock(key);
       //加锁,并且设置锁过期时间,防止死锁的产生
        mylock.lock(2, TimeUnit.MINUTES); 
        System.err.println("======lock======"+Thread.currentThread().getName());
       //加锁成功
        return  true;
    }
  //锁的释放
    public static void release(String lockName){
       //必须是和加锁时的同一个key
        String key = LOCK_TITLE + lockName;
       //获取所对象
        RLock mylock = redisson.getLock(key);
      //释放锁(解锁)
        mylock.unlock();
        System.err.println("======unlock======"+Thread.currentThread().getName());
    }
}

 

6,业务逻辑中使用分布式锁

@RequestMapping("/redder")
    @ResponseBody
    public String redder() throws IOException{
         String key = "test123";
        //加锁 
        DistributedRedisLock.acquire(key);
        //执行具体业务逻辑
        dosoming
        //释放锁
        DistributedRedisLock.release(key);
       //返回结果
        return soming; 
    }

 

  

 

  

 


以上是关于高性能分布式锁-redisson的使用的主要内容,如果未能解决你的问题,请参考以下文章

源码分析:Redisson 分布式锁过程分析

使用Redisson实现分布式锁

Redisson分布式锁

redis分布式锁redisson

Redis Redisson实现分布式锁,业务操作超时怎么处理?watch dog

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