`
睡着的兔子
  • 浏览: 34479 次
  • 性别: 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
分享到:
评论

相关推荐

    redis和redisson实现分布式锁

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

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

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

    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分布式锁使用实例.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添加为依赖: ``...

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

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

    基于redis的分布式锁

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

    redis——分布式锁.zip

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

    Redis从入门到精通(八)Redis实战(五)分布式锁误删与原子性问题、Redisson 测试项目代码

    这样,整个操作序列被视为一个整体,确保了在高并发环境下的一致性。 接下来,我们关注Redisson。Redisson不仅提供了一种简单的方式来创建和管理分布式锁,还支持锁的可重入性,即一个线程可以多次获取同一把锁,...

    基于Redis实现的分布式锁【100012506】

    在这个场景中,我们使用Redis作为分布式锁的实现基础,因为Redis提供了高并发、低延迟以及丰富的数据结构特性,非常适合构建这种机制。 Redis是一个内存中的键值存储系统,它支持多种数据结构,如字符串(strings)...

    Redis专场:如何利用Redisson分布式化传统Web项目

    Redisson是一个全面的Redis Java客户端,提供了丰富的数据结构(如集合、有序集合、哈希映射)以及分布式服务(如分布式锁、信号量、原子计数器)。以下将详细介绍Redisson如何帮助我们实现Web项目的分布式化: 1. ...

    redis同步锁AOP实现

    综上所述,利用Redisson和AOP实现的Redis同步锁是一种优雅的解决方案,它能有效地解决分布式环境中的并发问题,同时降低了代码的复杂性。在设计和实现时,需要注意锁的正确性、效率和安全性,以确保系统的稳定运行。

    redisson实现分布式锁原理

    总的来说,Redisson 的分布式锁通过 Lua 脚本和 Redis 的数据结构实现了高性能、高并发的锁定机制,同时具备可重入、防止死锁等特性,是 Java 应用在分布式环境中处理并发控制的理想选择。了解其工作原理有助于优化...

Global site tag (gtag.js) - Google Analytics