iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >springboot之如何同时连接多个redis
  • 504
分享到

springboot之如何同时连接多个redis

springboot连接多个redisspringboot连接redisspringbootredis 2023-05-16 11:05:23 504人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录技术选型 SpringBoot连接reids的三个客户端代码部分Maven pom引用application.yml配置Configuration代码启动失败日志启动成

线上服务需要连接三个Redis服务器;业务背景不能介绍,直接上代码:

技术选型 

springboot连接reids的三个客户端

Jedis:是Redis的Java实现客户端,提供了比较全面的Redis命令的支持,复杂的redis操作需要使用它;springboot1.x 默认集成;据说在高并发下有并发性问题出现;

Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器,springboot 2.x 默认集成

Redission:Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。暂时企业级开发感觉只是使用了分布式锁

结论:

单个redis随便使用哪个客户端都可以,也可以使用 Jedis + Redission 或者 Lettuce + Redission;

由于Jedis使用和研究比较多,此处使用Jedis抛砖引玉,实现三组redis + 分布式;Lettuce版本也可以根据此思路编写;

代码部分

maven pom引用

        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
			<exclusions>
				<!-- 不依赖Redis的异步客户端lettuce -->
				<exclusion>
					<groupId>io.lettuce</groupId>
					<artifactId>lettuce-core</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
 
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
		</dependency>

application.yml配置

spring:
  redis:
    r1:
      host: 192.168.1.210
      port: 6379
      passWord: 
      #cluster:
        #nodes: 192.168.1.101:6379,192.168.1.102:6379,192.168.1.103:6379
    r2:
      host: 192.168.1.211
      port: 6379
      password: 
      #cluster:
        #nodes: 192.168.1.104:6379,192.168.1.105:6379,192.168.1.106:6379
    r3:
      host: 192.168.1.212
      port: 6379
      password: 
      #cluster:
        #nodes: 192.168.1.107:6379,192.168.1.108:6379,192.168.1.109:6379

Configuration代码

 
import java.util.HashSet;
import java.util.Set;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
 
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import redis.clients.jedis.JedisPoolConfig;
 

@Slf4j
@Configuration
public class RedisJedisConfig2 {
	// r1 redis 配置信息
    @Value("${spring.redis.r1.host:}")
    private String r1Host;
 
    @Value("${spring.redis.r1.port:}")
    private Integer r1Port;
 
    @Value("${spring.redis.r1.password:}")
    private String r1Password;
    
    @Value("${spring.redis.r1.cluster.nodes:}")
    private String r1Nodes;
 
    //r2 redis 配置信息
    @Value("${spring.redis.r2.host:}")
    private String r2Host;
 
    @Value("${spring.redis.r2.port:}")
    private Integer r2Port;
 
    @Value("${spring.redis.r2.password:}")
    private String r2Password;
    
    @Value("${spring.redis.r2.cluster.nodes:}")
    private String r2Nodes;
    
    //r3 redis 配置信息
    @Value("${spring.redis.r3.host:}")
    private String r3Host;
 
    @Value("${spring.redis.r3.port:}")
    private Integer r3Port;
 
    @Value("${spring.redis.r3.password:}")
    private String r3Password;
    
    @Value("${spring.redis.r3.cluster.nodes:}")
    private String r3Nodes;
 
    
    public RedisConnectionFactory connectionFactory(
    		RedisStandaloneConfiguration redisStandaloneConfiguration, 
    		RedisClusterConfiguration redisClusterConfiguration, 
    		JedisPoolConfig jedisPoolConfig) {
    	if (redisStandaloneConfiguration == null && redisClusterConfiguration == null) {
    		log.error("==============请添加redis配置================");
    		return null;
    	}
    	
        JedisConnectionFactory jedisConnectionFactory = null;
        
        if (redisStandaloneConfiguration != null) {
        	jedisConnectionFactory = new JedisConnectionFactory(redisStandaloneConfiguration);
        } else {
        	jedisConnectionFactory = new JedisConnectionFactory(redisClusterConfiguration, jedisPoolConfig);
        }
        jedisConnectionFactory.afterPropertiesSet();
        
        // 检查是否可用
        RedisConnection connection = null;
        try {
        	connection = jedisConnectionFactory.getConnection();
        	log.info("reids是否可用:" + !connection.isClosed());
        } catch(Exception e) {
        	log.error("reids不可用,请检查组件是否启动:",e);
        } finally {
        	connection.close();
        }
        
        return jedisConnectionFactory;
    }
 
    
    public JedisPoolConfig poolConfig() {
    	JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(200);
        config.setMaxIdle(50);
        config.setMinIdle(8);
        config.setMaxWaitMillis(10000);         // 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1
        config.setTestOnBorrow(true);           // 在获取连接的时候检查有效性, 默认false
        config.setTestOnReturn(false);          // 调用returnObject方法时,是否进行有效检查
        config.setTestWhileIdle(true);          // Idle时进行连接扫描
        config.setTimeBetweenEvictionRunsMillis(30000);     // 表示idle object evitor两次扫描之间要sleep的毫秒数
        config.setNumTestsPerEvictionRun(10);               // 表示idle object evitor每次扫描的最多的对象数
        config.setMinEvictableIdleTimeMillis(60000);        // 表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义
        return config;
    }
    
    
    public RedisStandaloneConfiguration redisStandaloneConfiguration(String host, int port, String password, int index) {
    	RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(host, port);
    	
    	if (StrUtil.isNotBlank(password)) {
    		redisStandaloneConfiguration.setPassword(password);
        }
    	if (index != 0) {
    		redisStandaloneConfiguration.setDatabase(index);
        }
    	return redisStandaloneConfiguration;
    }
    
    
    public RedisClusterConfiguration redisClusterConfiguration(String clusterNodes, String password) {
        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
        // Set<RedisNode> clusterNodes
        String[] serverArray = clusterNodes.split(",");
        Set<RedisNode> nodes = new HashSet<RedisNode>();
        for (String ipPort : serverArray) {
            String[] ipAndPort = ipPort.split(":");
            nodes.add(new RedisNode(ipAndPort[0].trim(), Integer.valueOf(ipAndPort[1])));
        }
        redisClusterConfiguration.setClusterNodes(nodes);
        redisClusterConfiguration.setMaxRedirects(6);
        if (StrUtil.isNotBlank(password)) {
        	redisClusterConfiguration.setPassword(RedisPassword.of(password));
        }
        return redisClusterConfiguration;
    }
 
    @Bean(name = "redisR1Template")
    public RedisTemplate<String, Object> redisR1Template() {
    	RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisStandaloneConfiguration redisStandaloneConfiguration = null;
        RedisClusterConfiguration redisClusterConfiguration = null;
        if (StrUtil.isNotBlank(r1Host) && StrUtil.isBlank(r1Nodes)) {
        	redisStandaloneConfiguration = redisStandaloneConfiguration(r1Host, r1Port, r1Password, 0);
        } else if (StrUtil.isNotBlank(r1Nodes)) {
        	redisClusterConfiguration = redisClusterConfiguration(r1Nodes, r1Password);
        }
        log.info("=========================R1 redis信息 开始===============================");
        template.setConnectionFactory(connectionFactory(redisStandaloneConfiguration, redisClusterConfiguration, poolConfig()));
        log.info("=========================R1 redis信息 结束===============================");
        return template;
    }
 
    @Bean(name = "redisR2Template")
    public RedisTemplate<String, Object> redisR2Template() {
    	RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisStandaloneConfiguration redisStandaloneConfiguration = null;
        RedisClusterConfiguration redisClusterConfiguration = null;
        if (StrUtil.isNotBlank(r2Host) && StrUtil.isBlank(r2Nodes)) {
        	redisStandaloneConfiguration = redisStandaloneConfiguration(r2Host, r2Port, r2Password, 0);
        } else if (StrUtil.isNotBlank(r2Nodes)) {
        	redisClusterConfiguration = redisClusterConfiguration(r2Nodes, r2Password);
        }
        log.info("=========================R2 redis信息 开始===============================");
        template.setConnectionFactory(connectionFactory(redisStandaloneConfiguration, redisClusterConfiguration, poolConfig()));
        log.info("=========================R2 redis信息 结束===============================");
        return template;
    }
    
    @Bean(name = "redisR3Template")
    public RedisTemplate<String, Object> redisR3Template() {
    	RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisStandaloneConfiguration redisStandaloneConfiguration = null;
        RedisClusterConfiguration redisClusterConfiguration = null;
        if (StrUtil.isNotBlank(r3Host) && StrUtil.isBlank(r3Nodes)) {
        	redisStandaloneConfiguration = redisStandaloneConfiguration(r3Host, r3Port, r3Password, 0);
        } else if (StrUtil.isNotBlank(r3Nodes)) {
        	redisClusterConfiguration = redisClusterConfiguration(r3Nodes, r3Password);
        }
        log.info("=========================R3 redis信息 开始===============================");
        template.setConnectionFactory(connectionFactory(redisStandaloneConfiguration, redisClusterConfiguration, poolConfig()));
        log.info("=========================R3 redis信息 结束===============================");
        return template;
    }
}

其中在connectionFactory方法中,添加了,自动检查redis是否连接成功的代码,在启动项目时即可判断是否连接成功。

启动失败日志

启动成功日志

类中使用

@RestController
@RequestMapping("/redis")
public class TestRedisController {
	@Autowired
	RedisTemplate<String, Object> redisR1Template;
	@Autowired
	RedisTemplate<String, Object> redisR2Template;
	@Autowired
	RedisTemplate<String, Object> redisR3Template;
	
	@GetMapping("/cs")
	public String test() {
		redisR1Template.opsForValue().get("1");
		redisR2Template.opsForValue().get("1");
		redisR3Template.opsForValue().get("1");
		return "1";
	}
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: springboot之如何同时连接多个redis

本文链接: https://www.lsjlt.com/news/209629.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot之如何同时连接多个redis
    目录技术选型 Springboot连接reids的三个客户端代码部分maven pom引用application.yml配置Configuration代码启动失败日志启动成...
    99+
    2023-05-16
    springboot连接多个redis springboot连接redis springboot redis
  • springboot之怎么同时连接多个redis
    本文小编为大家详细介绍“springboot之怎么同时连接多个redis”,内容详细,步骤清晰,细节处理妥当,希望这篇“springboot之怎么同时连接多个redis”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-06
  • 使用springboot如何实现配置多个redis连接
    这篇文章将为大家详细讲解有关使用springboot如何实现配置多个redis连接,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、springboot nosql 简介Spring Dat...
    99+
    2023-05-31
    springboot redis
  • springboot如何连接两个数据库(多个)
    目录一、启动类二、application.yml文件三、创建配置类四 、结构五、多数据源的事物问题一、启动类 1.启动类需要不用加mybatis的@MapperScan注解 @Spr...
    99+
    2024-04-02
  • 同时建立多个goroutine与mongodb连接
    小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《同时建立多个goroutine与mongodb连接》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文...
    99+
    2024-04-04
  • 如何使用PHP连接多个Redis实例?
    随着互联网的不断发展,数据量不断增大,存储和读取的速度也变得至关重要。Redis作为一个非关系型的内存数据库,因其快速、可扩展和灵活性而受到广泛关注和使用。在一些高并发的场景下,或者对于某些强一致性要求较高的业务,需要使用多个Redis实例...
    99+
    2023-05-17
    PHP redis 连接
  • SpringBoot项目中如何同时操作多个数据库
    本篇内容主要讲解“SpringBoot项目中如何同时操作多个数据库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot项目中如何同时操作多个数据库”吧!在实际项目开发中可能存在需要...
    99+
    2023-06-29
  • springboot怎么处理多个连接
    Spring Boot可以使用多个连接的方式来处理,可以通过多线程、连接池等方式来实现。一种常见的方式是使用线程池来处理多个连接。可...
    99+
    2023-10-11
    springboot
  • SQL语句之如何用JOIN连接多个表
    目录SQL语句 用JOIN连接多个表SQL语句多表连接查询语法一、外连接二、内连接 三、交叉连接总结SQL语句 用JOIN连接多个表 连接两个数据表的用法 : SELECT * FROM actor I...
    99+
    2022-12-21
    SQL语句 JOIN连接多个表 SQLJOIN连接多个表
  • 如何连接一个redis集群
    要连接到一个Redis集群,可以按照以下步骤进行操作:1. 安装和配置Redis集群:首先,需要在所有的节点上安装Redis,并在每...
    99+
    2023-09-01
    redis
  • 多个服务连接redis并发问题如何解决
    解决多个服务连接Redis并发问题可以通过以下几种方法:1. 连接池:使用连接池来管理多个连接,每个服务从连接池中获取一个连接,使用...
    99+
    2023-09-04
    redis
  • springBoot @Scheduled如何实现多个任务同时开始执行
    springBoot @Scheduled如何实现多个任务同时开始执行,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。@Scheduled多个任务同时开始执行只需在...
    99+
    2023-06-22
  • redis连接超时该如何解决
    redis连接超时的解决方法:1.关闭防火墙。2.开放端口,将代码添加到防火墙的规则中。3.取消绑定,在redis.conf 配置文件中将bind 注释掉。redis连接超时的解决方法:关闭防火墙,例如:chkconfig iptables...
    99+
    2024-04-02
  • Python 异之如何同时运行多个协程详解
    目录正文1. 什么是 Asyncio gather()2. 如何使用 Asyncio gather()3. 列表中多个协程的 gather() 示例正文 asyncio 的一个好处...
    99+
    2023-03-22
    Python 异步同时运行多个协程 Python 异步协程
  • springboot 如何使用jedis连接Redis数据库
    springboot 使用jedis连接Redis数据库 1. 在 pom.xml 配置文件中添加依赖 <!-- redis 依赖 --> <...
    99+
    2024-04-02
  • 微服务同时接入多个Kafka
    最近在做微服务的迁移改造工作,其中有一个服务需要订阅多个Kafka,如果使用spring kafka自动配置的话只能配置一个Kafka,不符合需求,该文总结了如何配置多个Kafka,希望对您有帮助。 文章目录 准备工作最小化配...
    99+
    2023-08-19
    kafka 微服务 java
  • redis无法多个连接怎么解决
    如果Redis无法建立多个连接,可能是因为配置问题或者服务器资源不足导致的。以下是一些可能的解决方法:1. 检查Redis配置文件:...
    99+
    2023-09-01
    redis
  • Java 如何同时返回多个不同类型
    目录Java 同时返回多个不同类型前言首先我们创建一个2维元组我们可以利用继承机制实现长度更长的元组实例java return返回多个值或多种类型的值方法(list;Map)1、在写...
    99+
    2024-04-02
  • Appium同时连接多台手机进行测试(多
    作为测试小白,当时遇到了N多问题:   开启多线程后,发现app启动后,用例就停止了;且启动app对应的手机不能正确对应,用例中是A手机跑A用例,结果启动了B手机跑A用例报错。   主要原因:Appium Server启动时只区分了启动端...
    99+
    2023-01-30
    多台 进行测试 手机
  • node如何连接redis
    这篇文章主要介绍了node如何连接redis的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇node如何连接redis文章都会有所收获,下面我们一起来看看吧。安装redis。cnpm i re...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作