1. 程式人生 > 其它 >springboot專案同時操作redis伺服器的兩個庫以及操作兩個redis例項

springboot專案同時操作redis伺服器的兩個庫以及操作兩個redis例項

技術標籤: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例項和上述的程式碼很像,只需要做些小小的改動即可:

  1. pom.xml檔案不動
  2. 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
  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個庫,連線一個例項的不同庫和連線兩個例項的相同庫,以及連線兩個例項的不同庫,其原理都是相同的,只要做通一個功能,其餘的功能可以基於原有的功能上進行修改。