zoukankan      html  css  js  c++  java
  • Redisson使用01

    Java 8

    Spring Boot 2.5.3

    org.redisson:redisson:3.16.4

    Redis 单机版,4.0.9 (on Ubuntu)

    ---

    Redisson 可以用来做 分布式锁。

    这是孤使用前的认知,本文也是记录其分布式锁的简单使用。

    看过 阿里云的文档 才知,哦,Redisson原来号称【经过近4年日日夜夜的努力,Redisson终于在2019年1月16日成为GitHub里星星最多的Redis Java客户端】。

    原来,不仅仅是做 分布式锁啊。

    https://github.com/redisson/redisson

    https://developer.aliyun.com/profile/7cqhdxtuiehao

    https://mvnrepository.com/artifact/org.redisson/redisson

    本文根据其 GitHub的quick-start 进行试验。

    添加依赖包:最新版本

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

    添加配置:

    新建一个 RedissonClient Bean

    package com.example.webbasic.config;
    
    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;
    
    /**
     * Redisson配置
     * @author ben
     * @date 2021-11-29 20:56:01 CST
     */
    @Configuration
    public class RedissonConfig {
    	
    	@Bean
    	public RedissonClient redissonClient() {
    		Config cf = new Config();
    		// Redis服务器是单机的,配置为 集群模式,发生异常,启动失败
    //		cf.useClusterServers()
    //		.addNodeAddress("redis://192.168.0.111:6379");
          
    		// 单机配置,成功
    		cf.useSingleServer().setAddress("redis://mylinux:6379");
    		
    		RedissonClient rc = Redisson.create(cf);
    		return rc;
    	}
    
    }
    

    注,上面的配置支持 单机Redis,除了单机模式,还可以支持 主从、集群 等模式(useXXX方法)。

    使用上一步的 RedissonClient Bean 实现分布式锁:

    package com.example.webbasic.runner;
    
    import java.util.Date;
    import java.util.concurrent.TimeUnit;
    import java.util.stream.IntStream;
    
    import org.redisson.api.RLock;
    import org.redisson.api.RedissonClient;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.ApplicationArguments;
    import org.springframework.boot.ApplicationRunner;
    import org.springframework.stereotype.Component;
    
    /**
     * 基于Redisson的分布式锁测试
     * @author ben
     * @date 2021-11-29 21:05:19 CST
     */
    @Component
    public class RedissonDistLock implements ApplicationRunner {
    
    	@Autowired
    	private RedissonClient rc;
    
    	@Value("${server.port}")
    	private String port;
    	
    	@Override
    	public void run(ApplicationArguments args) throws Exception {
    		System.out.println("start: port=" + port);
    		
    		String mykey = "web-basic-key";
    		RLock rl = rc.getLock(mykey);
    		
    		IntStream.range(0, 10).forEach(i->{
    			rl.lock();
    			System.out.println("port=" + port + ", i=" + i + ", 1, now=" + new Date());
    			try {
    				TimeUnit.SECONDS.sleep(20);
    				System.out.println("port=" + port + ", i=" + i + ", 2");
    			} catch (InterruptedException e) {
    				System.out.println("port=" + port + ", i=" + i + ", 3 异常, e=" + e.getClass());
    //				e.printStackTrace();
    			} finally {
    				rl.unlock();
    				System.out.println("port=" + port + ", i=" + i + ", 4, now=" + new Date());
    				try {
    					TimeUnit.SECONDS.sleep(1);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    }
    

    rc.getLock(mykey) 生成了锁 RLock对象,执行此对象的 lock()、unlock() 实现分布式锁。

    Redis中键的变化:

    启动项目:分别在端口 5555、9999 运行

    注意,在测试程序的 rl.unlock() 后添加了 休眠,如果不添加的话,最先运行的进程会一直锁住执行——速度太快,而后运行的一直得不到锁。

    解决这个问题,除了 加休眠(不合理)外,还可以调用 rc.getFairLock(mykey) 来处理:公平锁——这才是 正确的用法。

    使用 公平锁时,Redis中数据的变化:多了两个,类型也不同了

    127.0.0.1:6379> keys *
    3) "redisson_lock_timeout:{web-basic-key}"
    4) "redisson_lock_queue:{web-basic-key}"
    6) "web-basic-key"
    127.0.0.1:6379>
    127.0.0.1:6379> type redisson_lock_timeout:{web-basic-key}
    zset
    127.0.0.1:6379>
    127.0.0.1:6379> type redisson_lock_queue:{web-basic-key}
    list
    127.0.0.1:6379>
    127.0.0.1:6379> type web-basic-key
    hash
    127.0.0.1:6379>

    》》》全文完《《《

    Redisson 还有更多功能待探索。

    疑问:

    使用Redisson的时候,怎么没有添加 Redis驱动呢?

    听说Redisson做分布式锁的时候有缺点,是什么呢?还需探索。

  • 相关阅读:
    SPOJ 149 FSHEEP Fencing in the Sheep ( 计算几何 + 二分 )
    UVa 11806
    UVa 1445
    HDU 4725 The Shortest Path in Nya Graph( 建图 + 最短路 )
    HDU 4661 Message Passing ( 树DP + 推公式 )
    从远程库克隆库
    添加远程库
    远程仓库
    删除文件
    撤销修改
  • 原文地址:https://www.cnblogs.com/luo630/p/15621672.html
Copyright © 2011-2022 走看看