Redis DB select

레디스 개발자 교육 신청 레디스 정기점검/기술지원
Redis Technical Support
레디스 엔터프라이즈 서버
Redis Enterprise Server

Spring RedisTemplate

레디스 서버는 기본적으로 16개의 DB(0번 ~ 15번)를 제공합니다. redis-cli에서는 select 명령으로 DB를 이동할 수 있습니다. 그러나 Spring에서 제공하는 RedisTemplate에는 DB를 이동(선택)할 수 있는 select 메소드를 제공하지 않습니다. 그럼 어떻게 여러 DB를 사용할 수 있는지 알아보겠습니다.

  • 레디스 서버에서 DB 개수 설정 방법: redis.conf 파일에서 databases로 변경할 수 있습니다. 변경 후에는 레디스 서버를 재시작해야 합니다.
  • 레디스 클러스터(cluster)에서는 하나의 DB(0번)만 사용할 수 있습니다.
  • Lettuce에서 제공하는 RedisClient에서는 select() 메소드로 DB를 이동(선택)할 수 있습니다. 이것에 대한 설명은 아래에 있습니다.

Project 생성: start.spring.io

dbselect project

Main Class: DbselectApplication

Class RedisConfig

DB를 선택할 수 있도록 dbno를 받도록 했다. redisConnectionFactory(int dbno)
@Bean을 사용하지 않는다.

DB 선택 방법

  • redisConfig에서 DB를 설정: redisConfig.setDatabase(dbno);
  • connectionFactory에서 DB를 선택: connectionFactory.getConnection().select(dbno);

Class RedisConfigDb0 extends RedisConfig

0번 DB를 선택하는 클래스: redisConnectionFactory(0):

public RedisConnectionFactory redisConnectionFactoryDb0() {
    return redisConnectionFactory(0);
}

@Bean(name = "stringRedisTemplateDb0") Bean 이름을 지정한다.

setConnectionFactory()로 connectionFactory를 설정한다.

  • redisTemplate.setConnectionFactory(redisConnectionFactoryDb0());
  • stringRedisTemplate.setConnectionFactory(redisConnectionFactoryDb0());

Class RedisConfigDb1 extends RedisConfig

1번 DB를 선택하는 클래스: redisConnectionFactory(1):

public RedisConnectionFactory redisConnectionFactoryDb1() {
    return redisConnectionFactory(1);
}

@Bean(name = "stringRedisTemplateDb1") Bean 이름을 지정한다.

setConnectionFactory()로 connectionFactory를 설정한다.

  • redisTemplate.setConnectionFactory(redisConnectionFactoryDb1());
  • stringRedisTemplate.setConnectionFactory(redisConnectionFactoryDb1());

Class RedisRepositoryAutowired

@Autowired를 이용한 Repository
Bean으로 지정한 이름을 사용한다.

Class RedisRepositoryParameter

생성자에 parameter(인자)를 이용한 Repository
Bean으로 지정한 이름을 사용한다.

public RedisRepositoryParameter(
      StringRedisTemplate stringRedisTemplateDb0,
      StringRedisTemplate stringRedisTemplateDb1)


Lettuce RedisClient

RedisClient에서는 select() 메소드로 DB를 이동(선택)할 수 있습니다.

redisClient.connect().sync().select(dbno);

레디스 서버에 연결 시에도 DB를 지정할 수 있습니다.

String uri = "redis://"+password+"@"+host+":"+port+"/"+dbno;

getRedisClient0은 0번 DB에 접속하고 getRedisClient1은 1번 DB에 접속한다. Bean name을 지정했다.

Class RedisClientConfig

Class RedisClientRepository

dbselect(int dbno): DB를 이동(선택)할 수 있다.
save(String key, String value): 0번 DB에 저장한다.
save1(String key, String value): 1번 DB에 저장한다.


Controller

Class RedisController

  • @GetMapping("/save0") redisRepositoryAutowired로 DB0,1에 저장합니다.
  • @GetMapping("/save1") redisRepositoryParameter로 DB0,1에 저장합니다.
  • @GetMapping("/save2") redisClientRepository로 DB0,1에 저장합니다.
  • @GetMapping("/save/{size}") 10개 스레드로 실행하면서 중간에 스레드1번에서 키 Thread1-500를 만나면 dbselect()를 실행해서 DB를 변경한다. 이후에는 이 스레드뿐만 아니라 다른 스레드에서도 DB10에 저장된다. (당연하지만 확인을 위해서 테스트해보았다.)
    if (key.equals("Thread1-500")) {
          redisClientRepository.dbselect(10);
    }


<< Async DB Select Spring Multi Data Source >>

Email 답글이 올라오면 이메일로 알려드리겠습니다.