redisson简介

Redisson是一个在Redis的基础上实现的Java驻内存数据网格,它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

spring redis用法 redisson spring_redis


Redisson作为独立节点 可以用于独立执行其他节点发布到分布式执行服务 和 分布式调度任务服务 里的远程任务

Redis命令和Redisson对象匹配列表

redisson集成

1)引入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.11.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
    </dependencies>

2)编写配置文件

server:
  port: 8080

spring:
  redis:
    database: 0
    host: localhost
    timeout: 10000
    port: 6379
    password: 123456
    lettuce:
      pool:
        max-wait: -1
        max-active: 8
        max-idle: 8
        min-idle: 0

3)编写配置类

@Data
@Component
@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {

    private String host;
    private int port;
    private String password;
    private int database;

}
@Slf4j
@Configuration
public class RedissionConfig {

    @Autowired
    private RedisProperties redisProperties;

    @Bean
    public RedissonClient redissonClient(){
        RedissonClient redissonClient;
        Config config = new Config();
        String url = "redis://" + redisProperties.getHost()
                + ":" + redisProperties.getPort();
        config.useSingleServer().setAddress(url) //单机
                .setPassword(redisProperties.getPassword())
                .setDatabase(redisProperties.getDatabase());
        //添加主从配置
        //config.useMasterSlaveServers().setMasterAddress("").setPassword("").addSlaveAddress(new String[]{"",""});
        //集群
        //config.useClusterServers().addNodeAddress(new String[]{"",""}).setPassword("");
        try {
            redissonClient = Redisson.create(config);
            return redissonClient;
        } catch (Exception e) {
            log.error("RedissonClient init redis url :[{}]",url,e.getMessage());
            return null;
        }
    }

}

redisson支持个各种redis环境,单机、主从、集群、哨兵等
4) 编写工具类实现锁的添加与释放及查询redisson配置信息

@Slf4j
@Component
public class ResissonUtil {

    @Autowired
    private RedissonClient redissonClient;

    /**
     * 获取RedissonClient 配置信息
     */
    public void getRedissonConfig() throws IOException {
        Config config = redissonClient.getConfig();
        System.out.println(config.toJSON());
    }

}
@Slf4j
@Component
public class RedissionLockUtil {

    @Autowired
    private RedissonClient redissonClient;

    /**
     * 加锁
     * @param lockname 名称
     */
    public Boolean lock(String lockname){
        try {
            if(null == redissonClient){
                log.error("RedissonClient is null");
                return false;
            }

            RLock lock = redissonClient.getLock(lockname);
            lock.lock(30, TimeUnit.SECONDS); //30秒后释放锁,防止死锁
            log.info("Thread [{}] lock [{}] success",Thread.currentThread().getName(),lockname);
            return true;
        } catch (Exception e) {
            log.info("lock [{}] exception",lockname,e);
            return false;
        }
    }

    /**
     * 释放锁
     * @param lockname 名称
     */
    public Boolean unlock(String lockname){
        try {
            if(null == redissonClient){
                log.error("RedissonClient is null");
               return false;
            }
            RLock lock = redissonClient.getLock(lockname);
            lock.unlock();
            log.info("Thread [{}] unlock [{}] success",Thread.currentThread().getName(),lockname);
            return true;
        } catch (Exception e) {
            log.info("unlock [{}] exception",lockname,e);
            return false;
        }
    }

}

5)编写测试代码

@RestController
@RequestMapping("/lock")
public class RedissionLockTest {

    @Autowired
    private RedissionLockUtil lockUtil;
    @Autowired
    private ResissonUtil resissonUtil;

    @GetMapping("/test")
    public void testLock() throws IOException {

        resissonUtil.getRedissonConfig();

        for (int i = 0;i < 5;i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Boolean lockStatus = lockUtil.lock("LOCK");
                }
            }).start();
        }
    }

}

6)启动项目,访问 http://localhost:8080/lock/test

spring redis用法 redisson spring_spring redis用法_02


控制台输出配置信息及日志信息,通过红框可以看出,因为我们没有释放锁,所以每个线程都会等待30s后当前线程释放锁以后才能执行。