redis里面JedisConnectionFactory 实现多个数据库切换(亲测有效)

本文介绍了在SpringBoot项目中,如何使用JedisConnectionFactory实现Redis的多个数据库切换。通过配置文件和RedisConfig.java类,详细阐述了配置过程及实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 需求

springboot项目,要使用redis的不同数据库,并且是JedisConnectionFactory 工厂

2 实现

主要是redis配置类里面做文章

pom 文件

 <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <exclusions>
                <!-- 过滤lettuce,使用jedis作为redis客户端 -->
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

redis.properties配置文件

#redis setting  
redis.host=localhost
redis.port=6379
redis.password=
redis.maxIdle=200
redis.minIdle=0
redis.maxActive=50
redis.maxWait=10000
redis.testOnBorrow=true
redis.timeout=100000

#定义需要使用的db
//#sessionCode DB
sessionCodeDb = 0
//#车辆基本信息 DB
bicycleInfoDb = 15
//#当前位置信息 DB
currentLocationDb = 14
//#锁车/解锁 DB
lockDb = 13
//#根据车牌获取电子车牌 DB
ebikeNoDb = 12
//#根据电子车牌获取车牌 DB
bikeNoDb = 11

RedisConfig.java 配置类 初始化redis连接池

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate
为了实现Redis的多租户,我们可以使用Redis的多数据库特性,为每个租户分配一个独立的数据库。同时,我们还需要使用Spring Boot的多数据源配置来实现Redis数据源的配置。以下是实现Redis多租户的步骤: 1.在Redis中为每个租户分配一个独立的数据库,可以使用SELECT命令来切换数据库。例如,使用SELECT 0选择第一个数据库,使用SELECT 1选择第二个数据库,以此类推。 2.在Spring Boot中配置多Redis数据源,可以使用MultiRedisTemplate来实现。MultiRedisTemplate是一个自定义的RedisTemplate,它可以管理多个Redis数据源。我们需要在配置文件中为每个Redis数据源配置不同的属性,例如host、port、password等。 3.在Redis数据源上下文切换RedisConfig中,我们需要使用ThreadLocal来存储当前租户的数据库编号。在每次访问Redis时,我们需要根据当前租户的数据库编号来切换到对应的数据库。 以下是一个简单的示例代码,演示如何实现Redis多租户: ```java // Redis多租户配置类 @Configuration public class MultiRedisConfig { @Bean(name = "redis1") @ConfigurationProperties(prefix = "spring.redis1") public JedisConnectionFactory redis1ConnectionFactory() { return new JedisConnectionFactory(); } @Bean(name = "redis2") @ConfigurationProperties(prefix = "spring.redis2") public JedisConnectionFactory redis2ConnectionFactory() { return new JedisConnectionFactory(); } @Bean(name = "multiRedisTemplate") public MultiRedisTemplate multiRedisTemplate(@Qualifier("redis1") RedisConnectionFactory redis1ConnectionFactory, @Qualifier("redis2") RedisConnectionFactory redis2ConnectionFactory) { MultiRedisTemplate multiRedisTemplate = new MultiRedisTemplate(); Map<String, RedisConnectionFactory> connectionFactoryMap = new HashMap<>(); connectionFactoryMap.put("redis1", redis1ConnectionFactory); connectionFactoryMap.put("redis2", redis2ConnectionFactory); multiRedisTemplate.setTargetRedisTemplateMap(connectionFactoryMap); return multiRedisTemplate; } } // Redis数据源上下文切换类 public class RedisContextHolder { private static final ThreadLocal<Integer> contextHolder = new ThreadLocal<>(); public static void setDataSource(Integer dataSource) { contextHolder.set(dataSource); } public static Integer getDataSource() { return contextHolder.get(); } public static void clearDataSource() { contextHolder.remove(); } } // Redis多租户模板类 public class MultiRedisTemplate extends RedisTemplate<String, Object> { private Map<String, RedisConnectionFactory> targetRedisTemplateMap; @Override public void afterPropertiesSet() { RedisConnectionFactory defaultTargetConnectionFactory = targetRedisTemplateMap.get("redis1"); setConnectionFactory(defaultTargetConnectionFactory); super.afterPropertiesSet(); } @Override protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) { Integer dataSource = RedisContextHolder.getDataSource(); if (dataSource != null) { RedisConnectionFactory targetConnectionFactory = targetRedisTemplateMap.get("redis" + dataSource); connection = targetConnectionFactory.getConnection(); } return super.preProcessConnection(connection, existingConnection); } public void setTargetRedisTemplateMap(Map<String, RedisConnectionFactory> targetRedisTemplateMap) { this.targetRedisTemplateMap = targetRedisTemplateMap; } } // 在业务代码中使用Redis多租户模板类 @Service public class RedisService { @Autowired private MultiRedisTemplate multiRedisTemplate; public void setValue(String key, Object value) { RedisContextHolder.setDataSource(1); // 切换到第二个数据库 multiRedisTemplate.opsForValue().set(key, value); RedisContextHolder.clearDataSource(); // 切换回默认数据库 } public Object getValue(String key) { RedisContextHolder.setDataSource(2); // 切换到第三个数据库 Object value = multiRedisTemplate.opsForValue().get(key); RedisContextHolder.clearDataSource(); // 切换回默认数据库 return value; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一写代码就开心

你的打赏将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值