Redis客户端

一个Redis连接有16个数据库:0~15,每个数据库都是独立的

SpringBoot Controller多数据库 springboot多数据库切换_spring boot

  • 切换数据库:select num

从数据库3切换到6

SpringBoot Controller多数据库 springboot多数据库切换_数据库_02

  • 移动数据:move key num

将user从数据库2移动到3

SpringBoot Controller多数据库 springboot多数据库切换_redis_03

  • 清空数据库:flushdb

在该数据库命令行flushdb,清空该数据库

SpringBoot Controller多数据库 springboot多数据库切换_spring_04

  • 清空当前连接的所有数据库:flushall

SpringBoot Controller多数据库 springboot多数据库切换_redis_05

配置数据库数目

在redis.conf配置文件中:

databases即设置一个连接中数据库的数目:16

SpringBoot Controller多数据库 springboot多数据库切换_数据库_06


springboot中外部化配置

Springboot中关于Redis的配置属性:

SpringBoot Controller多数据库 springboot多数据库切换_数据库_07

其中关于数据库的配置database只是设置我们使用16个数据库中的哪个数据库:

SpringBoot Controller多数据库 springboot多数据库切换_spring_08

想要同时操作多个数据库或者多个数据源需要外部化配置

操作多个数据库

配置类和SpringBoot的自动装配原理一样

结构:

SpringBoot Controller多数据库 springboot多数据库切换_数据库_09

自定义配置类,该配置类:

  • 定义连接redis的6个属性,first表示第一个数据库,second表示第二个数据库,表示一次操作两个数据库,host、password、port、timeout连接属性
  • 这两个数据库定义对应的RedisTemplate,封装Lettuce,因为这里仅仅操作String类型数据,就定义StringRedisTemplate
package com.database.database.cofig;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * Author : zfk
 * Data : 8:57
 */

@Configuration
@EnableAutoConfiguration
public class RedisConfig {


    @Value("${redis.database.first}")
    private int firstDatabase;

    @Value("${redis.database.second}")
    private int secondDatabase;

    @Value("${redis.host}")
    private String host;

    @Value("${redis.password}")
    private String password;

    @Value("${redis.port}")
    private int port;

    @Value("${redis.timeout}")
    private int timeout;


    @Bean(name = "firstRedisTemplate")
    public RedisTemplate getFirstRedisTemplate(){

        LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory();

        connectionFactory.setDatabase(firstDatabase);
        connectionFactory.setHostName(host);
        connectionFactory.setPassword(password);
        connectionFactory.setPort(port);
        connectionFactory.setTimeout(timeout);
        connectionFactory.afterPropertiesSet();			

        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(connectionFactory);
        return stringRedisTemplate;
    }


    @Bean(name = "secondRedisTemplate")
    public RedisTemplate getSecondRedisTemplate(){

        LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory();
        connectionFactory.setDatabase(secondDatabase);
        connectionFactory.setHostName(host);
        connectionFactory.setPassword(password);
        connectionFactory.setPort(port);
        connectionFactory.setTimeout(timeout);
        connectionFactory.afterPropertiesSet();

        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(connectionFactory);
        return stringRedisTemplate;
    }

}

application.yml:这里对应配置的value

redis:
  database:
    first: 0
    second: 1
  host: ip地址
  password: 密码
  port: 6379
  timeout: 3000

测试类:

package com.database.database;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

@SpringBootTest
class DatabaseApplicationTests {


    @Autowired
    private RedisTemplate firstRedisTemplate;

    @Autowired
    private RedisTemplate secondRedisTemplate;

    @Test
    void contextLoads() {

        ValueOperations operations = firstRedisTemplate.opsForValue();
        operations.set("age", "25");
        String age = (String) operations.get("age");
        System.out.println("年龄:"+age);

        ValueOperations operations2 = secondRedisTemplate.opsForValue();
        operations2.set("address", "beijing");

        String address = (String) operations2.get("address");
        System.out.println("地址:"+address);
    }

}

结果:同时操作了两个数据库,一个存放age,一个存放address

SpringBoot Controller多数据库 springboot多数据库切换_数据库_10

SpringBoot Controller多数据库 springboot多数据库切换_spring boot_11

操作多个数据源

有时还需要操作多个Redis连接
Jedis、Lettuce都相当于Redis客户端,RedisTemplate封装Jedis/Lettuce,那么我们设置两个RedisTemplate即可操作两个Redis连接

添加一个配置类RedisConfig2:

package com.database.database.cofig;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * Author : zfk
 * Data : 10:46
 */
@Configuration
@EnableAutoConfiguration
public class RedisConfig2 {


    @Value("${redis2.database}")
    private int database = 0;

    @Value("${redis2.host}")
    private String host;

    @Value("${redis2.password}")
    private String password;

    @Value("${redis2.port}")
    private int port;

    @Value("${redis2.timeout}")
    private int timeout;

    @Bean(name = "redisTemplate2")
    RedisTemplate getRedisTemplate2(){
        
        LettuceConnectionFactory factory = new LettuceConnectionFactory();
        factory.setDatabase(database);
        factory.setPort(port);
        factory.setHostName(host);
        factory.setPassword(password);
        factory.setTimeout(timeout);
        factory.afterPropertiesSet();

        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(factory);
        return stringRedisTemplate;
    }

}

application.yml连接配置:

## 远程连接
redis:
  database:
    first: 0
    second: 1
  host: ip地址
  password: 密码
  port: 6379
  timeout: 3000
  
## 本地连接
redis2:
  database: 2
  host: 127.0.0.1
  password: 密码
  port: 6379
  timeout: 3000

测试类DatabaseApplicationTests:相比上面添加了个测试方法和注入了RedisTemplate2

package com.database.database;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

@SpringBootTest
class DatabaseApplicationTests {


    @Autowired
    private RedisTemplate firstRedisTemplate;

    @Autowired
    private RedisTemplate secondRedisTemplate;

    @Autowired
    private RedisTemplate redisTemplate2;

    @Test
    void contextLoads() {

        ValueOperations operations = firstRedisTemplate.opsForValue();
        operations.set("age", "25");
        String age = (String) operations.get("age");
        System.out.println("年龄:"+age);

        ValueOperations operations2 = secondRedisTemplate.opsForValue();
        operations2.set("address", "beijing");

        String address = (String) operations2.get("address");
        System.out.println("地址:"+address);
    }


    @Test
    public void test(){
        //操作本地Redis连接
        ValueOperations valueOperations = redisTemplate2.opsForValue();
        valueOperations.set("age","26");
        System.out.println("本地Redis=> age:"+valueOperations.get("age").toString());

        //操作远程Redis连接
        ValueOperations operations = firstRedisTemplate.opsForValue();
        String age = (String) operations.get("age");
        System.out.println("远程Redis=> age:"+age);

    }
}

测试结果:

SpringBoot Controller多数据库 springboot多数据库切换_spring_12

两个Redis连接:

SpringBoot Controller多数据库 springboot多数据库切换_redis_13


SpringBoot Controller多数据库 springboot多数据库切换_redis_14