springboot_intro
Spring Redis Connection Auto Config
Redis Developer Course | Redis Technical Support | Redis Enterprise Server |
---|
Spring Boot Redis Properties
이 문서는 Spring Boot에서 application.properties or yml을 이용해서 Redis Server에 연결하는 방법을 설명합니다.
레디스 접속 기본 클라이언트 라이브러리로
Spring Boot 1.x에서는 Jedis를 사용하였고, 2.x부터는 Lettuce를 사용합니다.
이 문서에서는 Lettuce를 기준으로 설명합니다.
Spring Redis Properties 관련 공식 문서는 아래 링크를 참고하세요.
- Spring Boot 2.7.14 RedisProperties (docs.spring.io)
spring.redis @ConfigurationProperties(prefix="spring.redis")
- Spring Boot 3.1.3 RedisProperties (docs.spring.io)
spring.data.redis @ConfigurationProperties(prefix="spring.data.redis") - Spring Boot 최신(current) RedisProperties (docs.spring.io)
- Spring Boot RedisProperties.java (github.com java soruce)
- Spring Boot RedisAutoConfiguration.java (github.com java soruce)
- Spring Data Redis (3.1.3 docs.spring.io 설명)
Spring Boot 3.x
application.properties 설정
- Spring Boot 2.x에서는 spring.redis로 시작
- Spring Boot 3.x에서는 spring.data.redis로 시작
이 문서는 Spring Boot 3.x를 기준으로 작성합니다.
Auto Configuration 설정 방법
Auto Configuration은 application.properties에 설정만 해 놓으면 설정한 값으로 Redis Server에 연결은
Spring이 알아서 해줍니다.
Redis Auto Configuration에는 세 가지가 있다.
- Standalone
- Sentinel
- Cluster
Standalone 설정
redis.host: 레디스 서버의 IP를 입력합니다. (필수)
redis.port: 레디스 서버의 port를 입력합니다. (필수)
password: redis server에 password(requirepass) 설정했을 경우 사용합니다. (선택)
application.properties
application.yml
Sentinel 설정
sentinel.nodes: 센티널 서버의 IP:Port를 입력합니다. (필수)
센티널 서버 3대 정보를 모두 입력합니다.
sentinel.master: sentinel.conf에 "sentinel monitor mymaster 192.168.56.102 18520 2"
이와 같이 입력했을 경우 'mymaster'를 입력합니다. (필수)
Lettuce는 위 정보로 센티널 서버에 접속해서 'sentinel master mymaster' 명령을 실행해서
레디스 마스터 서버 정보를 얻어오고, 'sentinel replicas mymaster' 명령을 실행해서
복제 서버 정보를 얻어옵니다. 그러므로 레디스 서버의 IP:Port는 입력할 필요없습니다.
sentinel.password: 센티널 서버에 password(requirepass) 설정했을 경우 사용합니다. (선택)
redis.password: 레디스 서버에 password(requirepass) 설정했을 경우 사용합니다. (선택)
application.properties
application.yml
Cluster 설정
cluster.nodes: 클러스터로 설정한 레디스 서버의 IP:Port를 입력합니다. (필수)
6대 정보를 모두 입력합니다.
redis.password: 레디스 서버에 password(requirepass) 설정했을 경우 사용합니다. (선택)
application.properties
application.yml
프로젝트 생성
start.spring.io
- Project: Gradle
- Language: Java
- Spring Boot 3.1.3
- Group: com.redisgate
- Artifact: redis2
- Packaging: Jar
- Java: 17
- Dependencies
- Spring Web
- Lombok
- Spring Data Redis(Access+Driver)
Spring Boot 2.x -> Java 11 이하
개발 IDE: IntelliJ
Java 소스
Package 구성
Java 파일(클래스) 설명
- Redis2Application.java: main program
- StringEntity.java: Redis String data type용 entity
- StringRepository.java: 저장(save), 조회(get)한다.
- StringController.java: url 요청을 받아 실행한다.
Redis2Application.java
StringEntity.java
StringRepository.java
StringController.java
프로그램 테스트
프로그램 테스트는 Talend api Tester 확장 프로그램을 사용했습니다.
입력
METHOD: POST
URL: http://localhost:9090/api/string
BODY(입력 내용): { "key": "key01", "value": "value01" }
조회
METHOD: GET
URL: http://localhost:9090/api/string/key01
BODY(조회 결과): { "key": "key01", "value": "value01" }
class RedisProperties 설명
여기에 있는 항목(필드)를 application.properties에 설정하면 자동 적용된다.
application.properties: spring.data.redis로 시작한다.
예) spring.data.redis.host = localhost or 127.0.0.1
springboot 3.1.3 기준
Redis general Properties
No | Field | 설명 Desc |
---|---|---|
1 | String host = "localhost" | Redis server host(IP). redis.conf: bind |
2 | int port = 6379 | Redis server port. redis.conf: port |
3 | int database = 0 | Database index used by the connection factory. 기본으로 제공되는 16개(0~15번) DB를 접속시 선택한다. Spring Auto Config에서는 접속 후 DB를 변경할 수 없다. (select 명령이 제공되지 않는다) * 참고: Redis Cluster는 0번 DB만 사용된다. |
4 | String username | Login username of the redis server. |
5 | String password | Login password of the redis server. redis.conf: requirepass |
6 | Duration timeout | Read(command) timeout. Default 60초 io.lettuce.core.RedisURI DEFAULT_TIMEOUT = 60 (sec) Redis에 적절한 timeout: 3~5초 권장 |
7 | String url |
redis://[[username:]password@]host [: port][/database] [? [timeout=timeout[d|h|m|s|ms|us|ns]] [&database=database] [&clientName=clientName]] 예) redis://password@127.0.0.1:6379/0?timeout=10s 위와 같이 설정하면 password, host, port, database, timeout을 따로 설정하지 않아도 된다. |
8 | Duration connectTimeout | Connection timeout. Default 10초 io.lettuce.core.SocketOptions DEFAULT_CONNECT_TIMEOUT = 10 (sec) |
9 | String clientName | Client name to be set on connections with CLIENT SETNAME. |
10 | ClientType clientType | Type of client to use. By default, auto-detected according to the classpath. LETTUCE -> Use the Lettuce redis client. JEDIS -> Use the Jedis redis client. |
11 | Sentinel sentinel | 센티널 노드, 마스터이름 등 설정, 아래 Sentinel properties 참조 |
12 | Cluster cluster | 클러스터 노드 등 설정, 아래 Cluster properties 참조 |
13 | final Ssl ssl = new Ssl() | SSL: 보안 소켓 계층(Secure Sockets Layer) 사용 여부 설정 아래 SSL properties 참조 |
14 | final Jedis jedis = new Jedis() | Jedis pool 설정, 아래 Jedis properties 참조 |
15 | final Lettuce lettuce = new Lettuce() | Pool, Cluster topology refresh period 등 설정 아래 Lettuce properties 참조 |
Pool properties (static class)
Pool은 바로 지정할 수 없고 아래와 같이 lettuce, jedis 다음에 지정한다.
spring.data.redis.lettuce.pool.enabled = true
spring.data.redis.jedis.pool.enabled = true
No | Field | 설명 Desc |
---|---|---|
1 | Boolean enabled | Whether to enable the pool. Enabled automatically if "commons-pool2" is
available. With Jedis, pooling is implicitly enabled in sentinel mode and this
setting only applies to single node setup. Pool을 활성화할지 여부입니다. "commons-pool2"를 사용할 수 있는 경우 자동으로 활성화됩니다. Jedis를 사용하면 센티넬 모드에서 풀링이 암시적으로 활성화되며 이 설정은 단일 노드 설정에만 적용됩니다. spring.data.redis.lettuce.pool.enabled = true Lettuce: GenericObjectPoolConfig(), ClientResources |
2 | int maxIdle = 8 | Maximum number of "idle" connections in the pool. Use a negative value to
indicate an unlimited number of idle connections. Pool의 최대 "유휴(idle)" 연결 수입니다. 유휴 연결 수에 제한이 없음을 나타내려면 음수 값을 사용합니다. |
3 | int minIdle = 0 | Target for the minimum number of idle connections to maintain in the pool.
This setting only has an effect if both it and time between eviction runs are positive. Pool에서 유지 관리할 최소 유휴 연결 수의 목표입니다. 이 설정은 해당 설정과 제거 실행 사이의 시간이 모두 양수인 경우에만 효과가 있습니다. |
4 | int maxActive = 8 | Maximum number of connections that can be allocated by the pool at a given time.
Use a negative value for no limit. 주어진 시간에 pool에서 할당할 수 있는 최대 연결 수입니다. 제한이 없으면 음수 값을 사용합니다. |
5 | Duration maxWait = Duration.ofMillis(-1) | Maximum amount of time a connection allocation should block before throwing an exception when the pool is exhausted.
Use a negative value to block indefinitely. Pool이 소진되었을 때 예외가 발생하기 전에 연결 할당이 차단되어야 하는 최대 시간입니다. 무기한 차단하려면 음수 값을 사용하세요. |
6 | Duration timeBetweenEvictionRuns | Time between runs of the idle object evictor thread.
When positive, the idle object evictor thread starts, otherwise no idle object eviction is performed. 유휴(idle) 개체 축출기 스레드 실행 사이의 시간입니다. 양수이면 유휴 개체 제거 스레드가 시작되고, 그렇지 않으면 유휴 개체 제거가 수행되지 않습니다. |
Cluster properties (static class)
No | Field | 설명 Desc |
---|---|---|
1 | List<String> nodes | Comma-separated list of "host:port" pairs to bootstrap from.
This represents an "initial" list of cluster nodes and is required to have at least one entry. 부트스트랩할 "host:port" 쌍의 쉼표로 구분된 목록입니다. 이는 클러스터 노드의 초기(initial) 목록을 나타내며 하나 이상의 항목이 있어야 합니다. 마스터 노드 뿐만 아니라 복제 노드까지 모두 나열하세요. (마스터가 모두 다운되었을 경우를 대비해서) |
2 | Integer maxRedirects | Maximum number of redirects to follow when executing commands across the cluster. 클러스터 전체에서 명령을 실행할 때 따라야 할 최대 리디렉션 수입니다. 슬롯 이동(reshard)과 관련있습니다. 내부적으로 ClusterClientOptions class에서 int DEFAULT_MAX_REDIRECTS = 5 설정되어 있습니다. 특별한 사유가 없으면 기본값대로 사용하세요. (별도로 설정하지 마세요) |
Sentinel properties (static class)
No | Field | 설명 Desc |
---|---|---|
1 | String master | Name of the Redis server. sentinel.conf: sentinel monitor mymaster 127.0.0.1 6379 2 application.properties: spring.data.redis.sentinel.master = mymaster |
2 | List<String> nodes | Comma-separated list of "host:port" pairs. application.properties: spring.data.redis.sentinel.nodes = 127.0.0.1:16379, 127.0.0.1:16380 List로 선언되어 있는데 구현에서 RedisSentinelConfiguration(String master, Set<String> sentinelHostAndPorts)는 Set으로 되어있으므로 Set으로 변경해야 한다. 예제) RedisSentinelConfiguration(redisInfo.getSentinel().getMaster(), new HashSet<>(redisInfo.getSentinel().getNodes())); |
3 | String username | Login username for authenticating with sentinel(s). 센티널에 username을 설정한 경우 sentinel.conf: sentinel sentinel-user <username> |
4 | String password | Password for authenticating with sentinel(s). 센티널에 password를 설정한 경우 sentinel.conf: requirepass <password> or sentinel sentinel-pass <password> |
SSL properties (static class)
No | Field | 설명 Desc |
---|---|---|
1 | Boolean enabled | Whether to enable SSL support.
Enabled automatically if "bundle" is provided unless specified otherwise. SSL 지원 활성화 여부. 별도로 지정하지 않는 한 "번들(bundle)"이 제공되면 자동으로 활성화됩니다. |
2 | String bundle | SSL bundle name. |
Jedis properties (static class)
No | Field | 설명 Desc |
---|---|---|
1 | final Pool pool = new Pool() | Jedis pool configuration. |
Lettuce properties (static class)
No | Field | 설명 Desc |
---|---|---|
1 | Duration shutdownTimeout = Duration.ofMillis(100) | Shutdown timeout. |
2 | final Pool pool = new Pool() | Lettuce pool configuration. |
3 | final Cluster cluster = new Cluster() | 아래 Cluster properties 참조. |
Lettuce.Cluster properties (static class)
No | Field | 설명 Desc |
---|---|---|
1 | final Refresh refresh = new Refresh() | ClusterTopologyRefreshOptions: 기간(여부 포함) 설정한다. 아래 Refresh properties 참조. |
Lettuce.Cluster.Refresh properties (static class)
No | Field | 설명 Desc |
---|---|---|
1 | boolean dynamicRefreshSources = true | Whether to discover and query all cluster nodes for obtaining the
cluster topology. When set to false, only the initial seed nodes are
used as sources for topology discovery. 클러스터 토폴로지를 얻기 위해 모든 클러스터 노드를 검색하고 쿼리할지 여부입니다. false로 설정하면 초기 시드(seed) 노드만 토폴로지 검색의 소스로 사용됩니다. true: CLUSTER NODES 명령을 실행해서 얻은 모든 노드들에 CLUSTER NODES 명령을 실행한다. false: spring.data.redis.cluster.nodes 에 지정된 노드들에만 CLUSTER NODES 명령을 실행한다. |
2 | Duration period (중요) | Cluster topology refresh period. 클러스터 토폴로지 새로고침 기간(주기). spring.data.redis.lettuce.cluster.refresh.period: 60s ClusterTopologyRefreshOptions.enablePeriodicRefresh(Duration.ofSeconds(60)) 설정된 주기마다 레디스 서버에 HELLO, CLIENT SETNAME, CLUSTER NODES, INFO 4개 명령을 실행합니다. 3 마스터, 3 복제 구성에서 마스터1번이 다운되면 새로고침(refresh) 전까지는 마스터1번에 입력되는 명령은 에러가 발생합니다. 다른 마스터에 입력되는 명령과 복제에 조회 명령은 정상적으로 실행됩니다. 새로고침 후에는 복제1번이 새 마스터가 된것을 인지해서 입력 명령이 정상적으로 실행됩니다. 설정해야 합니다. 설정하지 않으면 새로고침을 하지 않습니다. 적정 값: 30초 ~ 60초 (일반적인 기준) |
3 | boolean adaptive | Whether adaptive topology refreshing using all available refresh triggers should be used. 사용 가능한 모든 새로 고침 트리거를 사용하여 적응형 토폴로지 새로 고침을 사용해야 하는지 여부입니다. true: ClusterTopologyRefreshOptions.enableAllAdaptiveRefreshTriggers() |
Java Source
- public class RedisProperties
- public class RedisAutoConfiguration
- public interface RedisConnectionDetails extends ConnectionDetails
- abstract class RedisConnectionConfiguration
- class LettuceConnectionConfiguration extends RedisConnectionConfiguration
springboot 3.1.3 기준
RedisProperties.java
RedisAutoConfiguration.java
RedisConnectionDetails.java
RedisConnectionConfiguration.java
LettuceConnectionConfiguration.java
enablePeriodicRefresh(), GenericObjectPoolConfig(connection pool) 등이 있다.
PDF manual
Spring Boot Auto Config | Manual Config >> |
---|