Spring Data R2DBC-redis和多数据源
Redis使用
直接说实现。
1.需要引入
<dependencies><!-- Spring Boot Redis Reactive --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId></dependency><!-- 连接池 (可选) --><dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></dependency>
</dependencies>
2.配置文件 (application.yml)
spring:redis:host: localhostport: 6379password: yourpassworddatabase: 0timeout: 2000mslettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: -1ms
需要注意:redis的r2dbc目前只有lettuce。
3.获取配置
@Slf4j
@EnableCaching
@Configuration(proxyBeanMethods = false)
@AutoConfigureBefore({RedisAutoConfiguration.class, RedisReactiveAutoConfiguration.class})
@EnableConfigurationProperties(RedisProperties.class)
public class RedisConfiguration {@Bean@ConditionalOnMissingBeanpublic RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));CacheProperties.Redis redisProperties = cacheProperties.getRedis();if (redisProperties.getTimeToLive() != null) {config = config.entryTtl(redisProperties.getTimeToLive());}if (redisProperties.getKeyPrefix() != null) {config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());}if (!redisProperties.isCacheNullValues()) {config = config.disableCachingNullValues();}if (!redisProperties.isUseKeyPrefix()) {config = config.disableKeyPrefix();}return config;}@Bean@ConditionalOnMissingBean(name = "RedisClient")public RedisClient redisClient(RedisProperties properties,RedisMessageListener listener) {log.info("call RedisClient()");RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();BeanUtils.copyProperties(properties, config);GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();BeanUtils.copyProperties(properties.getLettuce(), poolConfig);R2RedisProperties cfg = new R2RedisProperties();cfg.setRedisConfig(config);cfg.setPoolConfig(poolConfig);RedisClient client = new RedisClient(cfg);return client;}}
RedisClient就是封装了redis操作。主要使用ReactiveRedisTemplate对象。
4.Redis的R2dbc需要通过配置更换db,所以不同的db需要用不同的ReactiveRedisConnectionFactory 生成ReactiveRedisTemplate对象。
public ReactiveRedisConnectionFactory reactiveRedisConnectionFactory() {RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();config.setHostName("localhost");config.setPort(6379);config.setPassword("yourpassword");config.setIndex(2);LettucePoolingClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder().poolConfig(createPoolConfig()).commandTimeout(Duration.ofSeconds(2)).build();return new LettuceConnectionFactory(config, clientConfig);}private GenericObjectPoolConfig<?> createPoolConfig() {GenericObjectPoolConfig<?> poolConfig = new GenericObjectPoolConfig<>();poolConfig.setMaxTotal(8);poolConfig.setMaxIdle(8);poolConfig.setMinIdle(0);poolConfig.setMaxWait(Duration.ofSeconds(1));poolConfig.setTestOnBorrow(true);poolConfig.setTestOnReturn(true);return poolConfig;}
这样就是redis的操作和切换db;
多数据源
还是直接上代码;
import io.r2dbc.pool.ConnectionPool;
import io.r2dbc.pool.ConnectionPoolConfiguration;
import io.r2dbc.spi.ConnectionFactories;
import io.r2dbc.spi.ConnectionFactory;
import io.r2dbc.spi.ConnectionFactoryOptions;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.r2dbc.R2dbcProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;@Configuration
public class R2dbcConfig {@Bean@ConfigurationProperties(prefix = "spring.r2dbc.primary")public R2dbcProperties primaryR2dbcProperties() {return new R2dbcProperties();}@Bean@ConfigurationProperties(prefix = "spring.r2dbc.secondary")public R2dbcProperties secondaryR2dbcProperties() {return new R2dbcProperties();}@Bean@ConfigurationProperties(prefix = "spring.r2dbc.tertiary")public R2dbcProperties tertiaryR2dbcProperties() {return new R2dbcProperties();}@Primary@Bean(name = "primaryConnectionFactory")public ConnectionFactory primaryConnectionFactory(@Qualifier("primaryR2dbcProperties") R2dbcProperties properties) {return createConnectionFactory(properties);}@Bean(name = "secondaryConnectionFactory")public ConnectionFactory secondaryConnectionFactory(@Qualifier("secondaryR2dbcProperties") R2dbcProperties properties) {return createConnectionFactory(properties);}@Bean(name = "tertiaryConnectionFactory")public ConnectionFactory tertiaryConnectionFactory(@Qualifier("tertiaryR2dbcProperties") R2dbcProperties properties) {return createConnectionFactory(properties);}private ConnectionFactory createConnectionFactory(R2dbcProperties properties) {ConnectionFactoryOptions options=ConnectionFactoryOptions.parse(properties.getUrl()).mutate().option(ConnectionFactoryOptions.USER, properties.getUsername()).option(ConnectionFactoryOptions.PASSWORD, properties.getPassword()).build();ConnectionFactory connectionFactory=ConnectionFactories.get(options);ConnectionPoolConfiguration config = ConnectionPoolConfiguration.builder(connectionFactory).initialSize(properties.getPool().getInitialSize()).maxSize(properties.getPool().getMaxSize()).minIdle(properties.getPool().getMinIdle()).maxIdleTime(properties.getPool().getMaxIdleTime()).maxLifeTime(properties.getPool().getMaxLifeTime()).maxAcquireTime(properties.getPool().getMaxAcquireTime()).build();return new ConnectionPool(config);}@Primary@Bean(name = "primaryTemplate")public R2dbcEntityTemplate primaryTemplate(@Qualifier("primaryConnectionFactory") ConnectionFactory connectionFactory) {return new R2dbcEntityTemplate(connectionFactory);}@Bean(name = "secondaryTemplate")public R2dbcEntityTemplate secondaryTemplate(@Qualifier("secondaryConnectionFactory") ConnectionFactory connectionFactory) {return new R2dbcEntityTemplate(connectionFactory);}@Bean(name = "tertiaryTemplate")public R2dbcEntityTemplate tertiaryTemplate(@Qualifier("tertiaryConnectionFactory") ConnectionFactory connectionFactory) {return new R2dbcEntityTemplate(connectionFactory);}}
2.类似配置配置文件 (application.yml)
spring:r2dbc:primary:url: r2dbc:mysql://localhost:3306/primary_dbusername: primary_userpassword: primary_passpool:initial-size: 5max-size: 20max-idle-time: 30msecondary:url: r2dbc:postgresql://localhost:5432/secondary_dbusername: secondary_userpassword: secondary_passpool:initial-size: 3max-size: 15max-idle-time: 20m
使用时
@Autowired
Qualifier("secondaryTemplate")
R2dbcEntityTemplate r2dbc;
可以根据自己需要封装一下。
