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对象需要什么 ?
- 需要
RedisConnectionFactory
,它是获取redis链接的工厂对象 - 需要声明序列化规则
setKeySerializer
- 需要不被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
需要什么 ?
- 需要
RedisConfiguration
什么使用的redis数据源信息。 - 需要
LettuceClientConfiguration
客户端配置,什么最大连接数,最小连接数,超时时间,销毁时间等。
构造代码如下:
LettuceConnectionFactory redisConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration,builder.build());
// 在属性配置后设置(很重要)
redisConnectionFactory.afterPropertiesSet();
builder.build()
就是在创建LettuceClientConfiguration
对象
第三步:构造RedisConfiguration
spring data redis 有多少种RedisConfiguration
实现 ?
如下图 :
以单点方式为例,代码如下 :
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("192.168.1.233",9379);
redisStandaloneConfiguration.setPassword("redis_password");
第四步:构造LettuceClientConfiguration
构造LettuceClientConfiguration
spring 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;
}