[转]SpringBoot集成redisson(单机,集群,哨兵)

Redisson(二)SpringBoot集成Redisson redison-spring-boot-starter依赖于与最新版本的spring-boot兼容的redison-spring数据模块。支持Redis多种连接模式,这里以RedissonClient工具为例。 阅读详情

到处都是这篇文章的盗版,无法知道原文作者和链接,如果侵权请告知。

1.添加依赖

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

2.application.properties

spring.redis.database=0
spring.redis.password=
spring.redis.timeout=3000
#sentinel/cluster/single
spring.redis.mode=single
#连接池配置
spring.redis.pool.max-idle=16
spring.redis.pool.min-idle=8
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=3000
spring.redis.pool.conn-timeout=3000
spring.redis.pool.so-timeout=3000
spring.redis.pool.size=10
#单机配置
spring.redis.single.address=192.168.60.23:6379
#集群配置
spring.redis.cluster.scan-interval=1000
spring.redis.cluster.nodes=
spring.redis.cluster.read-mode=SLAVE
spring.redis.cluster.retry-attempts=3
spring.redis.cluster.failed-attempts=3
spring.redis.cluster.slave-connection-pool-size=64
spring.redis.cluster.master-connection-pool-size=64
spring.redis.cluster.retry-interval=1500
#哨兵配置
spring.redis.sentinel.master=business-master
spring.redis.sentinel.nodes=
spring.redis.sentinel.master-onlyWrite=true
spring.redis.sentinel.fail-max=3

3.配置文件读取

RedisProperties

import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * @author Abbot
 * @des
 * @date 2018/10/18 10:42
 **/

@ConfigurationProperties(prefix = "spring.redis", ignoreUnknownFields = false)
@Data
@ToString
public class RedisProperties {

    private int database;

    /**
     * 等待节点回复命令的时间。该时间从命令发送成功时开始计时
     */
    private int timeout;

    private String password;

    private String mode;

    /**
     * 池配置
     */
    private RedisPoolProperties pool;

    /**
     * 单机信息配置
     */
    private RedisSingleProperties single;

    /**
     * 集群 信息配置
     */
    private RedisClusterProperties cluster;

    /**
     * 哨兵配置
     */
    private RedisSentinelProperties sentinel;
}

资源池配置:

import lombok.Data;
import lombok.ToString;

/**
 * @author Abbot
 * @des redis 池配置
 * @date 2018/10/18 10:43
 **/
@Data
@ToString
public class RedisPoolProperties {

    private int maxIdle;

    private int minIdle;

    private int maxActive;

    private int maxWait;

    private int connTimeout;

    private int soTimeout;

    /**
     * 池大小
     */
    private  int size;

}

单机配置RedisSingleProperties :

@Data
@ToString
public class RedisSingleProperties {
    private  String address;
}

集群配置RedisClusterProperties:

@Data
@ToString
public class RedisClusterProperties {

    /**
     * 集群状态扫描间隔时间,单位是毫秒
     */
    private int scanInterval;

    /**
     * 集群节点
     */
    private String nodes;

    /**
     * 默认值: SLAVE(只在从服务节点里读取)设置读取操作选择节点的模式。 可用值为: SLAVE - 只在从服务节点里读取。
     * MASTER - 只在主服务节点里读取。 MASTER_SLAVE - 在主从服务节点里都可以读取
     */
    private String readMode;
    /**
     * (从节点连接池大小) 默认值:64
     */
    private int slaveConnectionPoolSize;
    /**
     * 主节点连接池大小)默认值:64
     */
    private int masterConnectionPoolSize;

    /**
     * (命令失败重试次数) 默认值:3
     */
    private int retryAttempts;

    /**
     *命令重试发送时间间隔,单位:毫秒 默认值:1500
     */
    private int retryInterval;

    /**
     * 执行失败最大次数默认值:3
     */
    private int failedAttempts;
}

哨兵配置 RedisSentinelProperties:

@Data
@ToString
public class RedisSentinelProperties {

    /**
     * 哨兵master 名称
     */
    private String master;

    /**
     * 哨兵节点
     */
    private String nodes;

    /**
     * 哨兵配置
     */
    private boolean masterOnlyWrite;

    /**
     *
     */
    private int failMax;
}

4. CacheConfiguration

@Configuration
@EnableConfigurationProperties(RedisProperties.class)
public class CacheConfiguration {

    @Autowired
    RedisProperties redisProperties;

    @Configuration
    @ConditionalOnClass({Redisson.class})
    @ConditionalOnExpression("'${spring.redis.mode}'=='single' or '${spring.redis.mode}'=='cluster' or '${spring.redis.mode}'=='sentinel'")
    protected class RedissonSingleClientConfiguration {

        /**
         * 单机模式 redisson 客户端
         */

        @Bean
        @ConditionalOnProperty(name = "spring.redis.mode", havingValue = "single")
        RedissonClient redissonSingle() {
            Config config = new Config();
            String node = redisProperties.getSingle().getAddress();
            node = node.startsWith("redis://") ? node : "redis://" + node;
            SingleServerConfig serverConfig = config.useSingleServer()
                    .setAddress(node)
                    .setTimeout(redisProperties.getPool().getConnTimeout())
                    .setConnectionPoolSize(redisProperties.getPool().getSize())
                    .setConnectionMinimumIdleSize(redisProperties.getPool().getMinIdle());
            if (StringUtils.isNotBlank(redisProperties.getPassword())) {
                serverConfig.setPassword(redisProperties.getPassword());
            }
            return Redisson.create(config);
        }


        /**
         * 集群模式的 redisson 客户端
         *
         * @return
         */
        @Bean
        @ConditionalOnProperty(name = "spring.redis.mode", havingValue = "cluster")
        RedissonClient redissonCluster() {
            System.out.println("cluster redisProperties:" + redisProperties.getCluster());

            Config config = new Config();
            String[] nodes = redisProperties.getCluster().getNodes().split(",");
            List<String> newNodes = new ArrayList(nodes.length);
            Arrays.stream(nodes).forEach((index) -> newNodes.add(
                    index.startsWith("redis://") ? index : "redis://" + index));

            ClusterServersConfig serverConfig = config.useClusterServers()
                    .addNodeAddress(newNodes.toArray(new String[0]))
                    .setScanInterval(
                            redisProperties.getCluster().getScanInterval())
                    .setIdleConnectionTimeout(
                            redisProperties.getPool().getSoTimeout())
                    .setConnectTimeout(
                            redisProperties.getPool().getConnTimeout())
                    .setFailedAttempts(
                            redisProperties.getCluster().getFailedAttempts())
                    .setRetryAttempts(
                            redisProperties.getCluster().getRetryAttempts())
                    .setRetryInterval(
                            redisProperties.getCluster().getRetryInterval())
                    .setMasterConnectionPoolSize(redisProperties.getCluster()
                            .getMasterConnectionPoolSize())
                    .setSlaveConnectionPoolSize(redisProperties.getCluster()
                            .getSlaveConnectionPoolSize())
                    .setTimeout(redisProperties.getTimeout());
            if (StringUtils.isNotBlank(redisProperties.getPassword())) {
                serverConfig.setPassword(redisProperties.getPassword());
            }
            return Redisson.create(config);
        }

       /**  
         * 哨兵模式 redisson 客户端
         * @return
         */

        @Bean
        @ConditionalOnProperty(name = "spring.redis.mode", havingValue = "sentinel")
        RedissonClient redissonSentinel() {
            System.out.println("sentinel redisProperties:" + redisProperties.getSentinel());
            Config config = new Config();
            String[] nodes = redisProperties.getSentinel().getNodes().split(",");
            List<String> newNodes = new ArrayList(nodes.length);
            Arrays.stream(nodes).forEach((index) -> newNodes.add(
                    index.startsWith("redis://") ? index : "redis://" + index));

            SentinelServersConfig serverConfig = config.useSentinelServers()
                    .addSentinelAddress(newNodes.toArray(new String[0]))
                    .setMasterName(redisProperties.getSentinel().getMaster())
                    .setReadMode(ReadMode.SLAVE)
                    .setFailedAttempts(redisProperties.getSentinel().getFailMax())
                    .setTimeout(redisProperties.getTimeout())
                    .setMasterConnectionPoolSize(redisProperties.getPool().getSize())
                    .setSlaveConnectionPoolSize(redisProperties.getPool().getSize());

            if (StringUtils.isNotBlank(redisProperties.getPassword())) {
                serverConfig.setPassword(redisProperties.getPassword());
            }

            return Redisson.create(config);
        }
    }
}

5.注入RedissClient客户端

如下这样写的目的是为了统一给其它服务提供接口

@Autowired
    RedissonClient redisson;

    @RequestMapping(value = "lock", method = RequestMethod.POST, consumes = "application/json;charset=UTF-8", produces = "application/json;charset=UTF-8")
    public @ResponseBody
    ServerResponse<RLock> lock(@RequestBody ServerRequest<LockReqBody> req) {
        return callR(redisson -> {
            RLock lock = redisson.getLock(req.getReqBody().getLockKey());
            lock.lock(req.getReqBody().getTimeout(), req.getReqBody().getUnit());
            return lock;
        });
    }
    //省略部分代码
    private <R> ServerResponse callR(Function<RedissonClient, R> function) {
        ServerResponse dv = RespHelper.serverResponse(RespCodeService.ERROR, "");
        try {
            long startTime = System.currentTimeMillis();
            dv = RespHelper.serverResponse(RespCodeService.SUCCESS, function.apply(redisson));
            logger.info("CALLR METHOD USE TIME:{}", System.currentTimeMillis() - startTime);
        } catch (Throwable e) {          
            System.out.println("callR error");
        }
        return dv;
    }
Springboot整合Redis-sentinel哨兵模式集群 Springboot整合Redis-sentinel哨兵模式集群 近日在项目中整合redis缓存,查了好多SpringBoot整合Redis的博客。经过多日研究测试终于成功了。特留博客供查阅。 1. pom.xml 添加Redis依赖 &amp;amp;lt;!-- redis --&amp;amp;gt; &amp;amp;lt;dependency&amp;amp;gt; &amp;amp;lt;groupId&amp 阅读详情

相关推荐

springboot-redis-redisson分布式锁

springboot-redis-redisson分布式锁一、Redis分布式锁实现原理简介1.普通分布式锁2.哨兵模式3.集群模式唯一ID看门狗Watchdog可重入锁获取锁释放锁二、 完整代码依赖application.properties配置配置类锁后业务接口规范redis加锁接口规范redis加锁实现类自定义异常测试类 比较:redis很明显优于zookeeper;就分布式锁实现的健壮性而言,zookeeper很明显优于redis。如何选择,取决于你的业务! 一、Redis分布式锁实现原理 简介

没啥简介 2182

Spring,Redis集成,以及多缓存配置

本文从概念是实操的角度说明了redis和spring的集成。第一章节摘自网络,这里转发了。 java编程接口 本章节来自网络。原文链接: https://www.cnblogs.com/mcbye/p/Jedis-VS-Redisson.html 概况对比 Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据...

617

SpringBoot集成Redisson实现分布式锁:从原理到秒杀实战

在分布式系统中,数据一致性是核心挑战之一,尤其在并发场景下,多个服务实例同时访问共享资源可能导致数据错乱。分布式锁作为一种协调机制,通过一个所有节点都能访问的中间件(如Redis)来实现互斥访问,其原理基于对共享资源的独占性控制。这项技术的核心价值在于保障关键业务操作的原子性和一致性,避免超卖、重复提交等问题,广泛应用于库存扣减、订单处理、分布式任务调度等场景。Redisson作为基于Redis的Java客户端,封装了生产级的分布式锁实现,提供了可重入锁、公平锁、读写锁等高级特性,并内置看门狗机制自动续期,

weixin_28710999的博客 204

SpringBoot集成redisson操作redis

该对象的最大容量受Redis限制,最大元素数量是4294967295个。基于Redisson的分布式Set结构的RSet Java对象实现了java.util.Set接口,通过元素的互相状态比较保证了每个元素的唯一性,该对象的最大容量受Redis限制,最大元素数量是4294967295个。基于Redisson的分布式列表 List 结构的RList Java对象在实现了java.util.List接口的同时,确保了元素插入时的顺序,该对象的最大容量受Redis限制,最大元素数量是4294967295个。

quanzhan_King的博客 6646

【SpringBoot】87、SpringBoot中集成Redisson实现Redis分布式锁

Redisson 是架设在 Redis 基础上的一个 Java 驻内存数据网格(In-Memory Data Grid)

JACKAL 3万+

【校招】SHL 的 General Ability (GA, 通用能力测试)

SHL 的 General Ability (GA, 通用能力测试) 文章目录SHL 的 General Ability (GA, 通用能力测试)1、归纳推理题1.1 圈圈线条推理1.2 图形颜色位置推理1.3 箭头指向推理2. 数字推理题攻略3. 语言推理题 1、归纳推理题   归纳推理题我把它总结为三种类型:圈圈线条推理;图形颜色位置推理;箭头指向推理。 1.1 圈圈线条推理   你别看这个题目看起来很复杂,其实很简单,而且这个题型的题目背后原理都一样!我把我的 tips 偷偷分享给你们嘿嘿~先从 A

Sunnyside_ 2万+

spring集成redis哨兵模式、及切换为单点模式

不用引入额外的maven依赖。 配置文件的改变。 配置类的改变,redisconfig方面的配置。 redis其实就用配置2方面,一个是config,一个是jedis链接池的配置。 spring.redis.work.mode = 1 spring.redis.database = 4 spring.redis.password = 1234 spring.redis.pool.max-active = 1024 spring.redis.pool.max-wait = 10000 spring.redis

enthan809882的博客 1748

Wireshark实战解析IEC 61850 GOOSE报文:智能变电站通信调试指南

网络协议分析是理解现代工业通信系统的基础,其核心原理在于对数据包的捕获、解码与解析。在电力自动化领域,IEC 61850标准定义了智能变电站内设备间高效、可靠的通信框架,其中GOOSE(通用面向对象变电站事件)协议因其基于以太网多播和快速重传机制,成为保护跳闸、联锁等关键信号传输的基石,其技术价值在于实现了微秒级延迟的高可靠性通信。掌握GOOSE报文的分析能力,对于现场调试、故障定位及系统验证至关重要。本文聚焦于使用Wireshark这一网络分析工具,深入解析GOOSE报文结构,涵盖从以太网帧头、协议标识到

weixin_34401479的博客 374

redis适配哨兵、单机、集群模式

redis适配哨兵、单机、集群模式

Grey_fantasy的博客 1365

DEXPI与Proteus XML:解锁过程工业P&ID数据互操作性的技术核心

本文深入探讨了DEXPI与Proteus XML在过程工业P&ID数据互操作性中的核心技术。通过解析DEXPI标准的开源特性和Proteus XML的架构设计,揭示了其在跨平台数据交换中的关键作用,并结合CADMATIC和西门子COMOS的实战案例,展示了如何实现高效的数据集成与转换。

weixin_29195615的博客 383

lighttools用透镜旋转手动创建菲尼尔透镜

学过很多软件,都没有留下痕迹,很多年之后只记得学过的软件常用的一些功能,稍微难一些的再次用起需要重新学,但如果留下点痕迹,重新再用就会很快。lighttools无意之中接触了,记一点点笔记吧。...

kingsai2012的博客 4329

springboot整合配置Redis单节点,集群,哨兵

springboot2.x其中使用的是Lettuce。 pom文件: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependen.

xy294636185的博客 1498

MFC中的CMFCToolBar:自定义按钮提示消息

通过以上步骤,您可以在MFC应用程序中使用CMFCToolBar创建自定义按钮,并设置按钮的提示消息。通过以上步骤,您可以在MFC应用程序中使用CMFCToolBar创建自定义按钮,并设置按钮的提示消息。通过上述代码,您可以在MFC应用程序中添加一个名为"ID_BUTTON_CUSTOM"的自定义按钮,并将其提示消息设置为"自定义提示消息"。通过上述代码,您可以在MFC应用程序中添加一个名为"ID_BUTTON_CUSTOM"的自定义按钮,并将其提示消息设置为"自定义提示消息"。

PixelInk的博客 1084

Redisson连接Redis单机&集群&哨兵配置示例

基于spring-boot-starter-data-redis原生配置集成Redission,连接不同模式(单机/主从/哨兵/集群)的Redis服务

idto315的博客 9786

agent-browser 安装笔记(OpenClaw)

【代码】agent-browser 安装笔记(OpenClaw)

tiantiantbtb的博客 1238

22、用户界面流程(UI Flow)全解析

本文全面解析了用户界面流程(UI Flow)的概念、创建步骤及其在系统设计中的应用。通过示例和操作步骤,详细介绍了如何确定屏幕范围、识别屏幕、创建过渡和标记触发器,并阐述了UI Flow在导航识别、验证、可用性优化、测试用例开发和需求推导中的重要作用。文章还结合问答系统案例,展示了UI Flow的实际应用价值,帮助读者深入理解并有效运用这一工具提升系统用户体验。

rice5的博客 153

SpringBoot集成redisson(单机,集群,哨兵)

1.springBoot集成redisson(单机,集群,哨兵) redisson版本使用3.8.2 &lt;dependency&gt;       &lt;groupId&gt;org.redisson&lt;/groupId&gt;       &lt;artifactId&gt;redisson&lt;/artifactId&gt;       &lt;version&gt;3.8....

跨过山和大海的博客 1万+

【异常】安装hermes-agent时提示GnuTLS recv error (-110): The TLS connection was non-properly terminated.

Git克隆仓库时出现TLS连接异常报错的解决方案摘要: 当执行git clone命令时遇到"GnuTLS recv error (-110)"报错,通常由网络不稳定、缓冲区不足或证书验证问题导致。主要解决方案包括:1)增大Git HTTP缓冲区(git config --global http.postBuffer 524288000);2)使用GitHub镜像站加速克隆;3)临时禁用SSL验证进行测试;4)检查并调整代理配置;5)改用SSH协议克隆。建议优先尝试增大缓冲区和镜像站方案,

奶爸的编程之路,也就一周冷个三天 1349

Spring Boot 集成 Redisson分布式锁(注解版)

在 Spring Boot 应用程序中使用 Redisson 可以方便地实现分布式应用程序的某些方面,例如分布式锁、分布式集合、分布式事件发布和订阅等。本篇是一个使用 Redisson 实现分布式锁的详细示例,在这个示例中,我们定义了DistributedLock注解,它可以标注在方法上,配合DistributedLockAspect切面以及IDistributedLock分布式锁封装的接口,来实现redisson 分布式锁的 API 调用。

Ascend1977的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

springboot+redisson 集群,哨兵,单机通用化配置

加入pom依赖 <!-- redisson --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.12.4</version> ..

可爱猪猪 3248

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Springboot集成Redisson

Springboot集成Redisson redissson可以提供分布式锁,延时队列,布隆过滤器等Redis高级功能,结合lettuce使用可以极大使用redis的各种特性,本文介绍如何在springboot框架下集成redisson lettuce集成请参考:Sringboot 集成redis(基于lettuce) https://blog.csdn.net/shuoyueqishilove/article/details/112417390 引入坐标: <!-- redisso

Alexon Xu的博客 916

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringBoot集成redis(3)|(Redisson方式实现分布式锁)

本章节主要介绍SpringBoot项目集成Redis的一些相关知识,主要介绍的是基于Springboot的Redisson方式,实现在分布式场景下锁机制。以上就是SpringBoot集成redisson实现分布式锁的代码,改方式实现可普通单机情况下的所有问题,广泛使用于分布式高并发场景下,存在的问题主要是特殊情况下,主机宕机造成锁异常问题,后面将介绍开源Redisson解决该问题的方式。

Oaklkm的博客 2213

基于Springboot的Redission 分布式锁配置及使用(单机、集群、哨兵、主从)

【代码】基于Springboot的Redission 分布式锁配置及使用(单机、集群、哨兵、主从)

qq_39091806的博客 4476

Spring Boot 兼容Redis、Redisson单机和哨兵模式

【代码】Spring boot 配置redis、redisson单机和哨兵模式。

CarryBest的博客 691
上一篇: 基于Redis的分布式锁实现方案
下一篇: 使用Redisson框架实现分布式锁
可爱徐叔叔
博客等级 码龄7年 5粉丝 12原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值