java config Spring data redis

  • Redis多数据源问题
  • 我遇见的场景如下 :
  • 构建思路如下
  • 第一步:构造RedisTemplate
  • 第二步:构造`RedisConnectionFactory`
  • 第三步:构造`RedisConfiguration`
  • 第四步:构造`LettuceClientConfiguration`
  • 第五步:序列化
  • 配置单点redis数据源完整代码


Redis多数据源问题

redis有主从模式,集群模式,哨兵模式和单点模式。不同的模式解决不同的问题,很多情况下需要同时用到多个模式。

这里仅选择使用官方推荐的Lettuce的缓存方式,如果使用jedis对象缓存,原理一样,但不做赘述。

我遇见的场景如下 :

分布式session使用了主从模式,为了使微服务客户端急速的获取到用户信息,客户端也连接了分布式session的redis主从服务,同时微服务客户端还需要使用集群的redis去缓存业务数据,这样微服务客户端就需要同时使用主从集群两个redis数据源。

构建思路如下

使用spring data redis 时是使用 RedisTemplate 对象,大多数时候使用方式如下 :

@Autowired
    private RedisTemplate<String, String> redisTemplate;

通过适配多数据源后,我们希望使用方式如下 :

@Autowired
    @Qualifier("redisStandalone")
    private RedisTemplate<String, String> redisTemplate;

仅修改bean的名字就可以在不修改代码的情况下继续使先有代码逻辑正常运行。
按照这个思路我们需要自己声明一个名为 redisStandalone的RedisTemplate的bean。

第一步:构造RedisTemplate

构造redisTemplate对象需要什么 ?

  1. 需要RedisConnectionFactory ,它是获取redis链接的工厂对象
  2. 需要声明序列化规则 setKeySerializer
  3. 需要不被spring data redis的自动化配置干扰afterPropertiesSet

声明RedisTemplate代码如下:

RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // 在属性配置后设置(很重要)
        redisTemplate.afterPropertiesSet();
        return redisTemplate;

第二步:构造RedisConnectionFactory

构造RedisConnectionFactory 需要什么 ?

  1. 需要RedisConfiguration 什么使用的redis数据源信息。
  2. 需要LettuceClientConfiguration 客户端配置,什么最大连接数,最小连接数,超时时间,销毁时间等。

构造代码如下:

LettuceConnectionFactory redisConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration,builder.build());
// 在属性配置后设置(很重要)
 redisConnectionFactory.afterPropertiesSet();

builder.build()就是在创建 LettuceClientConfiguration 对象

第三步:构造RedisConfiguration

spring data redis 有多少种RedisConfiguration实现 ?

如下图 :

redis多数据源连接 redis多数据源配置_多数据源

以单点方式为例,代码如下 :

RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("192.168.1.233",9379);
redisStandaloneConfiguration.setPassword("redis_password");

第四步:构造LettuceClientConfiguration

构造LettuceClientConfigurationspring data redis 提供了一个专门的构造器,不做赘述,代码如下 :

GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxIdle(10);
poolConfig.setMinIdle(2);
poolConfig.setMaxTotal(20);
poolConfig.setMaxWaitMillis(10000);
// 创建一个客户端构造器
LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder
        builder =  LettucePoolingClientConfiguration.builder().
        commandTimeout(Duration.ofMillis(10000));
builder.shutdownTimeout(Duration.ofMillis(4000));
 // 客户端连接池
builder.poolConfig(poolConfig);

第五步:序列化

序列化这里直接使用StringRedisSerializer序列化,不做赘述。

配置单点redis数据源完整代码

@Bean(name = "redisStandalone")
    public RedisTemplate<String, String> getFdfdRestTemplate () {
        log.info("【构造文件服务Redis缓存】 ");
        
        // 创建一个单点的redis配置
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("192.168.1.233",9379);
        redisStandaloneConfiguration.setPassword("redis_password");

        // 创建一个连接池配置
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        poolConfig.setMaxIdle(10);
        poolConfig.setMinIdle(2);
        poolConfig.setMaxTotal(20);
        poolConfig.setMaxWaitMillis(10000);

        // 创建一个客户端构造器
        LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder
                builder =  LettucePoolingClientConfiguration.builder().
                commandTimeout(Duration.ofMillis(10000));
        builder.shutdownTimeout(Duration.ofMillis(4000));
        // 客户端连接池
        builder.poolConfig(poolConfig);

        // redis链接工程
        LettuceConnectionFactory redisConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration,builder.build());
        // 在属性配置后设置(很重要)
        redisConnectionFactory.afterPropertiesSet();
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // 在属性配置后设置(很重要)
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }