当前位置: 首页 > news >正文

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;

可以根据自己需要封装一下。

http://www.dtcms.com/a/519646.html

相关文章:

  • 基于单片机的人体红外传感的步进电机调速自动门智能控制系统设计
  • 本地环境部署LangGraph
  • 在 R 医学数据分析中,关于 RStudio 和 VSCode 哪个效率更高
  • GPIO引脚操作方法概述
  • APP 开发抉择:定制服务与模板套用如何选?
  • 工程经理应该(有时候)写代码
  • Linux:进程间通信(1)
  • 基于ORB-SLAM、A*及DWA的自主导航方案
  • 阜新网站开发公司dede手机网站建设教程
  • 网站搭建价格宁波网站优化技术
  • 达梦数据库怎么查看连接情况
  • UVa1497/LA5719 A Letter to Programmers
  • 谷歌Quantum Echoes算法:迈向量子计算现实应用的重要一步
  • 网络管理员教程(初级)第六版--第2章 局域网技术
  • PY32F040单片机介绍(1)
  • 数据库多表关系、查询与约束
  • 空调设备公司网站建设建设部网站社保联网
  • 济源网站建设电话锦州做网站的个人
  • 逻辑推演题——谁是骗子
  • 单位网站建设汇报材料wordpress菜单保存不
  • 【底层机制】【Android】Android 系统的启动流程
  • js基础:06、函数(创建函数、参数、返回值、return、立即执行函数、对象(函数))和枚举对象的属性
  • LeetCode 刷题【131. 分割回文串】
  • 7. Functions(函数)
  • 零基础掌握 Vanna Text2SQL 框架:从原理到实战训练指南
  • [linux仓库]信号处理及可重入函数[进程信号·陆]
  • webrtc源码走读(一)-QOS-NACK-概述
  • wordpress 企业网站 免费如何注册网站免费的
  • 斗地主游戏源码,自适应手机版,带有管理后端
  • Linux桌面X11服务-XRecord方案捕获鼠标点击的应用窗口