`
睡着的兔子
  • 浏览: 34940 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

高并发环境下,Redisson实现redis分布式锁

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

使用redisson,最好采用redis 2.6.0以上版本,因为redosson一些后台命令采用eval的命令

import org.redisson.Redisson;
import org.redisson.api.RAtomicLong;
import org.redisson.config.Config;

public class RedissonManager {

    private static final String RAtomicName = "genId_";

    private static Config config = new Config();
    private static Redisson redisson = null;

   public static void init(String key,String value){
        try {
/*            config.useClusterServers() //这是用的集群server
                    .setScanInterval(2000) //设置集群状态扫描时间
                    .setMasterConnectionPoolSize(10000) //设置连接数
                    .setSlaveConnectionPoolSize(10000)
                    .addNodeAddress("127.0.0.1:6379");*/
        	if(key==null || "".equals(key)){
        		key=RAtomicName;
        	}
        	config.useSingleServer().setAddress("127.0.0.1:6379");
            redisson = (Redisson) Redisson.create(config);
            //清空自增的ID数字
            RAtomicLong atomicLong = redisson.getAtomicLong(key);
            long pValue=1;
            if(value!=null && !"".equals(value)){
            	pValue = Long.parseLong(value);
            }
            atomicLong.set(pValue);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static Redisson getRedisson(){
        return redisson;
    }

    /** 获取redis中的原子ID */
    public static Long nextID(){
        RAtomicLong atomicLong = getRedisson().getAtomicLong(RAtomicName);
       //原子性的获取下一个ID,递增1 
       atomicLong.incrementAndGet();
        return atomicLong.get();
    }
}



加锁和释放锁的方法,设置超时

public class DistributedRedisLock {
    private static Redisson redisson = RedissonManager.getRedisson();
    private static final String LOCK_TITLE = "redisLock_";

    public static boolean acquire(String lockName){
        String key = LOCK_TITLE + lockName;
        RLock mylock = redisson.getLock(key);
        mylock.lock(2, TimeUnit.MINUTES); //lock提供带timeout参数,timeout结束强制解锁,防止死锁
        System.err.println("======lock======"+Thread.currentThread().getName());
        return  true;
    }

    public static void release(String lockName){
        String key = LOCK_TITLE + lockName;
        RLock mylock = redisson.getLock(key);
        mylock.unlock();
        System.err.println("======unlock======"+Thread.currentThread().getName());
    }
}



在web端,controller中
    @RequestMapping("/redder")
    @ResponseBody
    public String redder() throws IOException{
    	 String key = "test123";
    	 
      DistributedRedisLock.acquire(key);
    		
    		 
      Long result =  RedissonManager.nextID();  

    	DistributedRedisLock.release(key);
    	return ""+result; 
    }


程序首先要设置 RedissonManager.init("","");  进行初始化,这样的目的主要是可以根据实际情况,设置对应的信息,设置递增的初始值。

目前用jmeter的测试,1000的并发,确保ID设置为1001
0
0
分享到:
评论

相关推荐

    C#实操控制并发之Lock和Redis分布式锁

    以下是一个简单的C# Redis分布式锁实现: ```csharp public bool TryAcquireLock(string lockKey, int lockTimeout) { var redis = ConnectionMultiplexer.Connect("localhost:6379"); var db = redis.Get...

    redis和redisson实现分布式锁

    锁竞争时的循环重试策略是为了在高并发环境下,当多个客户端同时尝试获取锁时,能够确保至少有一个客户端能够成功获取。在Redisson中,可以使用`tryLock`方法尝试获取锁,如果失败,可以通过设置超时时间和重试次数...

    003 redis分布式锁 jedis分布式锁 Redisson分布式锁 分段锁

    总的来说,Redis分布式锁通过Jedis或Redisson提供了可靠、高效的并发控制方案。分段锁作为一种优化策略,可以进一步提升大规模并发环境下的系统性能。在实际项目中,应根据业务需求和性能指标选择合适的锁实现,以...

    redisson实现分布式锁

    总结来说,Redisson的分布式锁是一种强大且灵活的工具,适用于需要高并发控制的分布式环境。结合AOP注解的使用,我们可以轻松地在Java应用中实现对关键操作的同步,保证数据的一致性和完整性。在实践中,我们需要...

    用Redis实现分布式锁_redis_分布式_

    1. 响应速度:Redis是内存数据库,读写速度快,非常适合处理高并发的锁请求。 2. 原子性:Redis的操作是原子性的,如`SETNX`(设置如果不存在)、`EXPIRE`(设置过期时间),确保了锁的获取与释放不会出现竞态条件。 3. ...

    案例实战-SpringBoot整合Redisson实现RedLock分布式锁同步

    RedLock是Redisson中的一个特性,它由Redis社区提出,旨在提供一种更健壮的分布式锁实现,比单节点Redis的`setnx`命令更可靠。 RedLock的实现基于以下假设: 1. 时钟偏移:所有参与的Redis服务器的时钟大致同步。 2...

    Redis分布式锁存在的问题及解决方案(值得珍藏)

    Redis分布式锁是解决多节点集群部署中并发控制的重要工具,但在使用过程中,它存在一些问题,需要谨慎处理。本文将详细探讨这些问题及其解决方案。 首先,死锁问题是Redis分布式锁的一个常见挑战。当一个进程获取了...

    Redis 分布式锁使用

    Redis,作为一个高性能的键值存储系统,由于其丰富的数据结构和优秀的性能,常被用来实现分布式锁。本文将深入探讨如何在实际应用中使用Redis实现分布式锁,以及涉及的相关技术细节。 ### Redis 分布式锁的基本概念...

    redis分布式锁使用实例.rar

    通过学习和实践这个“redis分布式锁使用实例”,你可以深入理解如何在实际项目中使用 Redis 和 Redisson 来实现高效且可靠的分布式锁,这对于处理分布式系统中的并发控制至关重要。同时,这也为你提供了设计和实现...

    Redis分布式锁.zip

    **Redis分布式锁的原理** 分布式锁通常需要满足以下条件: 1. **互斥性**:在同一时刻,只能有一个客户端获取锁。 2. **可重入性**:持有锁的客户端可以再次获取该锁,防止死锁。 3. **自动续期**:防止锁过期导致...

    Redis分布式锁.rar

    3. **锁的公平性**:在高并发场景下,为了保证公平性,可以使用`SETEX`命令一次性设置键的值和过期时间,避免因为网络延迟导致某些客户端长时间等待。 4. **续期机制**:为了避免锁在持有过程中过期,可以在持有锁...

    Redisson分布式锁.docx

    Redisson 是一个基于 Java 的 Redis 客户端,提供了分布式锁功能,可以用于实现高并发环境下的锁机制。本文将详细介绍 Redisson 分布式锁的实现原理、使用方法和源码分析。 Redisson 分布式锁的实现原理 Redisson ...

    redisson分布式锁的使用

    Redisson的分布式锁基于Redis的事务和单个命令原子性执行特性,提供了高可用和高性能的解决方案。 首先,我们需要引入Redisson的相关依赖到项目中。对于Java项目,可以通过Maven或Gradle将Redisson添加为依赖: ``...

    基于Spring Boot框架的分布式锁服务.zip

    Redis分布式锁利用Redis的SETNX命令实现分布式锁,确保在分布式环境下对资源的互斥访问。 Redisson分布式锁使用Redisson库提供的分布式锁实现,提供更高级的功能,如锁的自动续期和可重入锁。 2. 锁的续期和释放...

    redis分布式锁及会出现的问题解决

    Redis分布式锁是解决分布式系统中并发控制的一种常见方法,尤其在高并发场景下,如秒杀、限流等。本文将深入探讨Redis分布式锁的实现原理,以及可能出现的问题及解决方案。 ### 一、Redis实现分布式锁的主要原理 1...

    基于redis的分布式锁

    文件`31-distributed-lock-demo1`可能是包含一个具体的Redis分布式锁实现的代码示例或测试案例。通常,这样的代码会展示如何初始化Redis连接、如何获取和释放锁,以及如何处理可能出现的各种情况,比如锁超时、锁...

    redis——分布式锁.zip

    在实际应用中,还需要考虑锁的性能优化、故障恢复、分布式环境下的网络延迟等问题。例如,使用 Redisson 或 Jedis 等客户端库可以简化分布式锁的实现。这个资源包可能包含了相应的代码示例或项目配置,用于演示如何...

    Redis分布式锁解决接口幂等的两种方案

    通过编写测试用例,模拟并发调用,验证在分布式锁保护下的接口幂等性,确保在高并发情况下,多次调用接口不会导致数据异常。 ### 五、总结 利用Redis分布式锁解决接口幂等性,既保证了接口的正确性,又简化了开发...

Global site tag (gtag.js) - Google Analytics