• redison 自动续期的 分布式锁


    1 导入 maven

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

     2 初始化redisson 客户端(redison  支持 单机,主从,哨兵,分布式集群4 中模式)

     

        @Bean
        public RedissonClient redissonClient() {
            Config config = new Config();
            config.useSingleServer().setAddress("redis://ip:端口");
    
            RedissonClient redisson = Redisson.create(config);
    
            return redisson;
        }

    3 redison 可以为锁自动续租,原理就是维持了一个定时任务,给隔10 秒吧锁的过期时间设置为30 秒。如果这时候rredison 客户端退出,这个续期的定时任务被释放,锁就会过期。

    		RLock  lock = redissonClient.getLock("lockName");
    		
    		try {
    			if( lock.tryLock() ) {
    				System.out.println("拿到锁了做点事");
    			}
    			
    			
    		}catch (Exception e) {
    			e.printStackTrace();
    		}finally {
    			lock.unlock();
    		}
    

      

    4 redison 还提供了不续租的方法,可以指定  请求锁等待时间,和 锁过期时间的方法

    5 不带参数的 是不等锁(一次获取不到直接返回),锁自动续期。

     6 redison 的 获取锁默认是非公平的(随机抢锁),可以使用getFairLock获取公平锁(按时间顺序获取锁)

    RLock  lock = redissonClient.getFairLock("lockName");
    		
    		try {
    			if( lock.tryLock() ) {
    				System.out.println("拿到锁了做点事");
    			}
    			
    			
    		}catch (Exception e) {
    			e.printStackTrace();
    		}finally {
    			lock.unlock();
    		}
    

      

    7 redis 也有读写锁

    		RReadWriteLock  lock = redissonClient.getReadWriteLock("lockName");
    		lock.readLock();
    		lock.writeLock();
    

    8 getMultiLock 吧几把锁当做一把锁。( 是获取到全部的锁才算获取到了  这把多锁 )

    测试如果调用了t1锁定了 lock1 不释放,t2 获取不到锁。并且不会等待,直接返回。

    	@PostMapping("t1")
        public String t1() {
    		RLock  lock = redissonClient.getLock("lock1");
    		
    		try {
    			if( lock.tryLock() ) {
    				System.out.println("拿到锁了做点事");
    			}
    		}catch (Exception e) {
    			e.printStackTrace();
    		}
        	return "{}";
        }
    	
    	@PostMapping("t2")
        public String t2() {
    		
    		RLock  lock1 = redissonClient.getLock("lock1");
    		RLock  lock2 = redissonClient.getLock("lock2");
    		RLock  lock3 = redissonClient.getLock("lock3");
    		
    		
    		RLock  lockMulti = redissonClient.getMultiLock(lock1,lock2,lock3);
    		try {
    			if( lockMulti.tryLock() ) {
    				System.out.println("lockMulti拿到锁了做点事");
    			}
    		}catch (Exception e) {
    			e.printStackTrace();
    		}
        	return "{}";
        }
    

      

    9 redison 提供了  原子的 long 和 double ,可以对 原子的线程安全的修改 数据

      getAndAdd 相当于i++,addAndGet 相当于++i

    		RAtomicDouble  rdouble = redissonClient.getAtomicDouble("money");
    		
    		double d1 = rdouble.getAndAdd(1);
    		double d2 = rdouble.addAndGet(1);
    		
    		System.out.println(d1);
    		System.out.println(d2);
    

      

    10 并且提供了 二进制流,各种队列,各种集合,布隆过滤器,桶,GEO,发布订阅模型

    11 redison 提供了 countDownLatch 数量下降锁

    		RCountDownLatch  rCountDownLatch = redissonClient.getCountDownLatch("");
    		rCountDownLatch.trySetCount( 100 );
    		rCountDownLatch.countDown();
    		
    

      
    12  RedissonRedLock ,这个是个分布式多节点锁。只要获取超过一半的锁就算成功

    备注:Redison 提供了自动续租的分布式锁,但是我们不能一味的就用自动续期的锁,很多时候我们不希望无限的等锁,redis 默认的会自动过期的锁就够了。添加用户判断用户名是否重复,一般等几秒等不到锁具注册失败就行了,在默写情况比如执行一个长耗时的任务,这时候我们才可能会需要无限等待的锁。

  • 相关阅读:
    Winform 积累
    mvc部署iis遇到的问题总结
    开始我的BLOG生活
    sql 总结
    ajax:AutoCompleteExtender版本问题
    ancms即将上线
    ancms v2.3语言介绍
    asp.net的cms 核心代码篇
    div+css布局
    js词法结构
  • 原文地址:https://www.cnblogs.com/cxygg/p/15998082.html
Copyright © 2020-2023  润新知