背景说明

项目中已经使用了默认的库(db0), 但是有一个功能需要使用另一个库来存储数据。我这里所说的库都是针对同一个Redis中的。

方法一(简单粗暴型)

首先想到的就是直接切换数据库。代码如下:

// stringRedisTemplate 可以获取连接,直接更改连接的数据库
JedisConnectionFactory jedisConnectionFactory =(JedisConnectionFactory) stringRedisTemplate.getConnectionFactory();
jedisConnectionFactory.setDatabase(8);
stringRedisTemplate.setConnectionFactory(jedisConnectionFactory);

// 执行set 操作
ValueOperations valueOperations =stringRedisTemplate.opsForValue();
valueOperations.set("defaultDB", "this is the default dbinfo");

这种方式确实可以切换数据库, 但是存在的一个致命问题是: 如果你不再切换回去的话, 后面的操作就都是操作的这个数据库, 这显然不是我想要的效果。 PASS。

方法二(重新获取RedisTemplate)

 对每一个你要操作的库, 配置一个对应的 RedisTemplate, 这样需要哪个就用哪个。

Redis配置。 代码如下:

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.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import redis.clients.jedis.JedisPoolConfig;

@Configuration
public class RedisConfigWWj {

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

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

    @Value("${spring.redis.port}")
    private int port;

    @Value("${spring.redis.pool.max-active}")
    private int maxActive;
    // 你需要的数据库
    private int dbIndex = 8;

    public RedisConnectionFactory getRedisConnectionFactory(String hostName, int port, int database, int maxActive) { // 是负责建立Factory的连接工厂类
        JedisConnectionFactory jedisFactory = new JedisConnectionFactory();
        jedisFactory.setHostName(hostName);
        jedisFactory.setPort(port);
        jedisFactory.setDatabase(database)
        JedisPoolConfig poolConfig = new JedisPoolConfig(); // 进行连接池配置
        poolConfig.setMaxTotal(maxActive);
        // poolConfig.setMaxIdle(8);// 这些配置需要就加
        // poolConfig.setMinIdle(2);
        // poolConfig.setMaxWaitMillis(100);
        jedisFactory.setPoolConfig(poolConfig);
        jedisFactory.afterPropertiesSet(); // 初始化连接池配置
        return jedisFactory;
    }

    @Bean("redisDb8")
    public RedisTemplate<String, Object> getDb8RedisTemplate() {
        
        // 建立Redis的连接
        RedisConnectionFactory factory = this.getRedisConnectionFactory(hostName, port, dbIndex, maxActive);
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化类型
        redisTemplate.setValueSerializer(new StringRedisSerializer()); // value的序列化类型
        return redisTemplate;
    }
}

如何使用:

1.在你的类中注入需要的 RedisTemplate 
    @Resource(name = "redisTwo")
    private RedisTemplate redisTemplateTDb8;

2.执行对应的操作即可:
redisTemplateTwo.opsForValue().set("test-other-db", "this value should in db8");

这种方式适用于 springboot 是1.X 的版本。 

方法三

我在查找资料的时候最早是找到这个列子, 上关键部分代码:

public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig, int db) {
       
        // 单机版jedis
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        // 设置redis服务器的host或者ip地址
        redisStandaloneConfiguration.setHostName("127.55.41.247");
        // 设置默认使用的数据库
        redisStandaloneConfiguration.setDatabase(db);
        // 设置密码
        // redisStandaloneConfiguration.setPassword("123456");
        // 设置redis的服务的端口号
        redisStandaloneConfiguration.setPort(6739);

        // 获得默认的连接池构造器
        JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcb = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration
                .builder();
        // 指定jedisPoolConifig来修改默认的连接池构造器(真麻烦,滥用设计模式!)
        jpcb.poolConfig(jedisPoolConfig);
        // 通过构造器来构造jedis客户端配置
        JedisClientConfiguration jedisClientConfiguration = jpcb.build();
        // 单机配置 + 客户端配置 = jedis连接工厂
        return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
    }

这个例子中RedisStandaloneConfiguration 需要使用的 sping-data-redis.jar 版本需要2.0以上中才有会这个类。 但是jar升级到2.0后,项目直接启动不了, 因为我们的springboot版本是1.5X。

--结束

好记性不如烂笔头。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐