springboot專案同時操作redis伺服器的兩個庫以及操作兩個redis例項
阿新 • • 發佈:2020-12-22
技術標籤:springBootjava
本文介紹的有兩種連線方式:1.操作一個redis例項的不同庫。2.操作兩個redis例項的庫【這種情況相同不同都一樣】,兩種方法大差不差,基於一個大致的框架上小改即可實現。
先說第一種情況:
一、搭建專案
搭建專案比較簡單,idea可以自動生成,這裡只放pom.xml【依賴是我專案用到的,根據自己情況改】
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
< artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.siemens</groupId>
<artifactId>gat</artifactId>
<version >0.0.1</version>
<name>gat</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.42</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
二、application.yml檔案配置
server:
port: 8081
spring:
datasource:
name: druid_source
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/databaseName?characterEncoding=utf8&useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=true
username: xxxx
password: xxxx
#配置0號庫和10號庫
redis:
database:
db1: 0
db2: 10
host: 127.0.0.1
port: 6379
timeout: 10000
pool:
max-active: 100
max-idle: 3
min-idle: 0
max-wait: -1
三、redis配置類
package com.siemens.gat.config;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
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.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.time.Duration;
/**
* Created by SongShilun on 2020/12/14 10:12
*/
@Configuration
public class RedisConfig {
@Value("${redis.database.db1}")
private int db1;
@Value("${redis.database.db2}")
private int db2;
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private int port;
@Value("${redis.timeout}")
private int timeout;
@Value("${redis.pool.max-active}")
private int maxActive;
@Value("${redis.pool.max-idle}")
private int maxIdle;
@Value("${redis.pool.min-idle}")
private int minIdle;
@Value("${redis.pool.max-wait}")
private int maxWait;
@Bean
public GenericObjectPoolConfig getPoolConfig(){
// 配置redis連線池
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(maxActive);
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxWaitMillis(maxWait);
return poolConfig;
}
@Bean(name = "redisTemplate1")
public StringRedisTemplate getRedisTemplate1(){
return getStringRedisTemplate(db1);
}
@Bean(name = "redisTemplate2")
public StringRedisTemplate getRedisTemplate2(){
return getStringRedisTemplate(db2);
}
private StringRedisTemplate getStringRedisTemplate(int database) {
// 構建工廠物件
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName(host);
config.setPort(port);
//config.setPassword(RedisPassword.of(password));
LettucePoolingClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
.commandTimeout(Duration.ofSeconds(timeout))
.poolConfig(getPoolConfig())
.build();
LettuceConnectionFactory factory = new LettuceConnectionFactory(config, clientConfig);
// 設定使用的redis資料庫
factory.setDatabase(database);
// 重新初始化工廠
factory.afterPropertiesSet();
return new StringRedisTemplate(factory);
}
}
以上就是連線一個redis例項,分別操作一個redis例項的不同的兩個庫的配置
---------------------------------------------------------------分割線--------------------------------------------------------------
下邊說一下,當需要連線兩個不同伺服器上的redis時,應該怎麼配置:
ps:連線兩個redis例項和上述的程式碼很像,只需要做些小小的改動即可:
- pom.xml檔案不動
- application.yml:
server:
port: 8081
spring:
datasource:
name: druid_source
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/databaseName?characterEncoding=utf8&useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=true
username: xxxx
password: xxxx
#配置兩個redis例項,第一個用0號庫,用於讀取並監控資料變化;第二個用10號庫,用來存放資料變化的資訊
redis1:
database:
db1: 0
host: 127.0.0.1
port: 6379
timeout: 10000
pool:
max-active: 100
max-idle: 3
min-idle: 0
max-wait: -1
redis2:
database:
db2: 10
host: xxx.xxx.xx.xx
port: 6379
timeout: 10000
pool:
max-active: 100
max-idle: 3
min-idle: 0
max-wait: -1
- redis配置類
package com.siemens.gat.config;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
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.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.time.Duration;
/**
* Created by SongShilun on 2020/12/14 10:12
*/
@Configuration
public class RedisConfig {
@Value("${redis1.database.db1}")
private int db1;
@Value("${redis2.database.db2}")
private int db2;
@Value("${redis1.host}")
private String host1;
@Value("${redis1.port}")
private int port1;
@Value("${redis1.timeout}")
private int timeout;
@Value("${redis1.pool.max-active}")
private int maxActive;
@Value("${redis1.pool.max-idle}")
private int maxIdle;
@Value("${redis1.pool.min-idle}")
private int minIdle;
@Value("${redis1.pool.max-wait}")
private int maxWait;
@Value("${redis2.host}")
private String host2;
@Value("${redis2.port}")
private int port2;
@Bean
public GenericObjectPoolConfig getPoolConfig(){
// 配置redis連線池
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(maxActive);
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxWaitMillis(maxWait);
return poolConfig;
}
@Bean(name = "redisTemplate1")
public StringRedisTemplate getRedisTemplate1(){
return getStringRedisTemplate(db1,host1,port1);
}
@Bean(name = "redisTemplate2")
public StringRedisTemplate getRedisTemplate2(){
return getStringRedisTemplate(db2,host2,port2);
}
private StringRedisTemplate getStringRedisTemplate(int database,String address,int portNum) {
// 構建工廠物件
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName(address);
config.setPort(portNum);
//config.setPassword(RedisPassword.of(password));
LettucePoolingClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
.commandTimeout(Duration.ofSeconds(timeout))
.poolConfig(getPoolConfig())
.build();
LettuceConnectionFactory factory = new LettuceConnectionFactory(config, clientConfig);
// 設定使用的redis資料庫
factory.setDatabase(database);
// 重新初始化工廠
factory.afterPropertiesSet();
return new StringRedisTemplate(factory);
}
}
可以看出來,相比於連線一個redis例項的不同庫,連線兩個redis例項只多了application的一個配置資訊,和對redis配置類的工廠化方法的小改動。一個redis預設有下標為0-15的16個庫,連線一個例項的不同庫和連線兩個例項的相同庫,以及連線兩個例項的不同庫,其原理都是相同的,只要做通一個功能,其餘的功能可以基於原有的功能上進行修改。