Spring Boot集成Redisson详细介绍

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: Redisson是一个用于Java的分布式和高可用的Java对象的框架,它基于Redis实现。在Spring Boot应用程序中集成Redisson可以帮助我们更轻松地实现分布式锁、分布式对象、分布式集合等功能。本文将介绍如何在Spring Boot项目中集成Redisson,并展示一些基本用法。

Redisson是一个用于Java的分布式和高可用的Java对象的框架,它基于Redis实现。在Spring Boot应用程序中集成Redisson可以帮助我们更轻松地实现分布式锁、分布式对象、分布式集合等功能。本文将介绍如何在Spring Boot项目中集成Redisson,并展示一些基本用法。

springboot-redisson.jpg

添加依赖

在Spring Boot项目中,打开pom.xml文件并添加以下Redisson的Maven依赖:

<!-- redisson -->
<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson</artifactId>
  <version>3.25.2</version>
</dependency>

添加配置文件

在application.yml文件中添加Redisson的配置信息:

spring:
  redisson:
    #  单机模式
    host: 192.168.10.106
    port: 6379
    # 哨兵模式
    sentinel:
      master: mymaster
      nodes: 192.168.10.106:6209,192.168.10.106:6219,192.168.10.106:6229
    # 集群模式
    cluster: 192.168.10.106:6109,192.168.10.106:6119,192.168.10.106:6129
    # 密码
    password: xj2022

注意: 我们如果只有一个redis客户端的话我们在此处只需要配置一种模式,别的配置信息留空即可,我们会通过配置类优先找 哨兵配置,没有的话再找cluster集群配置,没有的话再找单机配置。

添加配置类

在代码中添加配置类RedissonConfig:


import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.StringCodec;
import org.redisson.config.Config;
import org.redisson.config.ReadMode;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
@Slf4j
public class RedissonConfig {
   
   


    @Value("${spring.redisson.sentinel.nodes}")
    private  String sentinel;
    @Value("${spring.redisson.sentinel.master}")
    private String masterName;

    @Value("${spring.redisson.cluster}")
    private  String cluster;

    @Value("${spring.redisson.host}")
    private String host;

    @Value("${spring.redisson.port}")
    private  String port;

    @Value("${spring.redisson.password}")
    private String password;




    private int timeout = 2000;
    private int scanInterval = 60000;
    private static String ADDRESS_PREFIX = "redis://";

    /**
     * 单机模式
     */
    @Bean
    public RedissonClient initBean() {
   
   
        // 哨兵模式
        if (StringUtils.isNotBlank(sentinel)) {
   
   
            log.info("redis is sentinel mode");
            return redissonSentinel();
        }
        // 集群模式
        if (StringUtils.isNotBlank(cluster)) {
   
   
            log.info("redis is cluster mode");
            return redissonCluster();
        }
        // 单机模式
        if (StringUtils.isNotBlank(host)) {
   
   
            log.info("redis is single mode");
            return redissonSingle();
        }

        log.error("redisson config can not support this redis mode");
        return null;
    }

    /**
     * 单机模式
     */
    private RedissonClient redissonSingle() {
   
   
        Config config = new Config();
        String address = ADDRESS_PREFIX+host+":"+port;
        //设置
        config.setCodec(new StringCodec())
                //这是用的集群server
                .useSingleServer()
                .setAddress(address)
                .setTimeout(timeout)
                .setPassword(password);
        return Redisson.create(config);
    }


    /**
     * 哨兵模式
     */
    private RedissonClient redissonSentinel() {
   
   

        String[] nodes = sentinel.split(",");
        //redisson版本是3.5,集群的ip前面要加上“redis://”,不然会报错,3.2版本可不加
        for(int i=0;i<nodes.length;i++){
   
   
            nodes[i] = ADDRESS_PREFIX+nodes[i];
        }
        Config config = new Config();
        //设置
        config.setCodec(new StringCodec())
                .useSentinelServers()
                .setMasterName(masterName)
                .setPassword(password)
                .setTimeout(timeout)
                .addSentinelAddress(nodes)
                // 在Redisson启动期间启用sentinels列表检查,默认为true,这里我们设置为false,不检查
                .setCheckSentinelsList(false);
        return Redisson.create(config);
    }

    /**
     * 集群模式
     */
    private RedissonClient redissonCluster() {
   
   
        String[] nodes = cluster.split(",");
        //redisson版本是3.5,集群的ip前面要加上“redis://”,不然会报错,3.2版本可不加
        for(int i=0;i<nodes.length;i++){
   
   
            nodes[i] = ADDRESS_PREFIX+nodes[i];
        }
        Config config = new Config();
        //设置
        config.setCodec(new StringCodec())
                //这是用的集群server
                .useClusterServers()
                //设置集群状态扫描时间
                .setScanInterval(scanInterval)
                .addNodeAddress(nodes)
                .setPassword(password)
                .setReadMode(ReadMode.MASTER);;
        return Redisson.create(config);
    }

}

这样,我们就配置好了redisson,我们可以在代码中使用了。

示例:分布式锁

以下是一个使用redisson 分布式锁的示例代码

import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
@Slf4j
public class RedissonTestService {
   
   


    @Resource
    private RedissonClient redissonClient;

    //锁过期时间
    private static final Long LOCK_KEY_TIME = 120L;

    public void doJobTask() {
   
   
        //定时任务执行周期较短,为防止数据重复修改,加入锁
        RLock lock = redissonClient.getLock("your_task_name");
        // 尝试获取锁并设定锁的过期时间
        boolean acquired = false;
        try {
   
   
            //获取锁
            acquired = lock.tryLock(0, LOCK_KEY_TIME, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
   
   
            log.error("取锁失败");
        }
        if (acquired) {
   
   
            try {
   
   
                // 执行业务逻辑

            }catch (Exception e) {
   
   
                log.error("处理失败");
                //业务异常处理逻辑

            }finally {
   
   
                // 释放锁
                lock.unlock();
            }

        } else {
   
   
            // 获取锁失败,说明有其他线程或进程正在处理数据
            // 可以进行重试或触发告警机制

        }
    }

}

这只是一个简单的示例,你可以根据需要使用更高级的Redisson功能。

总结

通过集成Redisson,我们可以轻松地实现分布式系统中的各种功能,提高应用程序的可伸缩性和可靠性。我们在生产环境会经常有跨机房使用承载网连接redis的情况,我们后续会在写一篇关于redisson实现承载网转换源码改造的文章。希望本文能够帮助你快速入门Spring Boot集成Redisson,并在实际项目中应用这些功能。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3天前
|
前端开发 Java API
Spring Boot与GraphQL的集成
Spring Boot与GraphQL的集成
|
3天前
|
Java Spring
Spring Boot与Zookeeper的集成应用
Spring Boot与Zookeeper的集成应用
|
3天前
|
开发框架 Java 数据库
Spring Boot集成多数据源的最佳实践
Spring Boot集成多数据源的最佳实践
|
3天前
|
NoSQL Java MongoDB
Spring Boot与MongoDB的集成应用
Spring Boot与MongoDB的集成应用
|
4天前
|
监控 负载均衡 Java
Spring Boot与微服务治理框架的集成
Spring Boot与微服务治理框架的集成
|
4天前
|
存储 Java 数据中心
Spring Boot与微服务治理框架的集成成功案例
Spring Boot与微服务治理框架的集成成功案例
|
2天前
|
网络协议 Java 微服务
Spring Boot中集成RSocket实现面向服务的通信
Spring Boot中集成RSocket实现面向服务的通信
|
4天前
|
负载均衡 监控 Java
Spring Boot与微服务治理框架的集成方法
Spring Boot与微服务治理框架的集成方法
|
4天前
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
11 1
|
5天前
|
监控 负载均衡 Java
Spring Boot与微服务治理框架的集成
Spring Boot与微服务治理框架的集成