Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

전공공부

[Redis] Reactive Redis 연결 및 상세 설명 본문

Study/Spring Boot

[Redis] Reactive Redis 연결 및 상세 설명

monitor 2024. 2. 5. 22:44
ReactiveRedisHashOperations
    @Bean
    public ReactiveHashOperations<String, String, Object> reactiveRedisOperations() {

        ReactiveRedisConnectionFactory connectionFactory = connectionFactory();

        RedisSerializer<String> stringRedisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        RedisSerializationContext<String, Object> serializationContext = RedisSerializationContext
                .<String, Object>newSerializationContext(new GenericJackson2JsonRedisSerializer())
                .key(stringRedisSerializer)
                .value(serializer)
                .hashKey(serializer)
                .hashValue(serializer)
                .build();
        return new ReactiveRedisTemplate<>(connectionFactory, serializationContext).opsForHash();
    }

 

위와 같이 설정하였다. RedisTemplate은 위와 같이 Redis 데이터 베이스와 상호작용을 하기 위한 설정 정보를 담은 클래스 이다. 필자는 위와 같이 설정했는데 RedisSerializationContext 부분이 key,value로 직렬화 해서 들어가는 것을 정의하는 것이다. 

아래 그림과 같이 한 Object로 저장하고 싶기 때문에 이런식으로 구현을 했다. 

Test라서 이렇지만... 실제로는 userID를 key로 쓸 것이다.

이렇게 빈 등록을 하면 RedisHashOperations를 생성자에 등록해서 사용하면 .get .put 등을 사용 할 수 있을 것이다.

ReactiveRedisConnectionFactory
    @Bean
    @Primary //
    public ReactiveRedisConnectionFactory connectionFactory() {
        // 클러스터 호스트 세팅
        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(redisInfo.getNodes());

        // topology 자동 업데이트 옵션 추가
        ClusterTopologyRefreshOptions clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
                .enableAllAdaptiveRefreshTriggers()  // MOVED, ASK, PERSISTENT_RECONNECTS, UNCOVERED_SLOT, UNKOWN_NODE trigger시 refresh 진행
                .enablePeriodicRefresh(Duration.ofHours(1L)) //1시간 마다 해당 Refresh 설정 사용
                .build();
        //clientOption 추가
        ClientOptions clientOptions = ClusterClientOptions.builder()
                .topologyRefreshOptions(clusterTopologyRefreshOptions)
                .build();

        LettuceClientConfiguration clientConfiguration = LettuceClientConfiguration.builder()
                .commandTimeout(Duration.of(10, ChronoUnit.SECONDS))
                .clientOptions(clientOptions)
                .readFrom(ReadFrom.REPLICA_PREFERRED)
                .build();

        redisClusterConfiguration.setMaxRedirects(redisInfo.getMaxRedirects());
        return new LettuceConnectionFactory(redisClusterConfiguration, clientConfiguration);
    }

 

[클러스터 토폴로지 뷰] : 클러스터 내의 노드의 연결구조

 

connectionFactory 메서드를 호출해서 위와 같이 설정 정보를 등록한 객체를 불러와서 사용하는데 ClusterTopologyRefreshOption 부터 보면 우선 처음 enableAllAdaptiveRefreshTrigger 메서드는 어떠한 명령이 실행되면 무조건 클러스터의 토폴리지 뷰를 새로 고침 한다는 것이며 enablePeriodicRefresh는 말 그대로 지정한 시간 마다 새로고침을 한 다는 것입니다.

 

clientOption 부분은 위에서 설정한 clusterTopologyRefreshOption을 적용하는 곳입니다.

 

LettuceClientConfiguration 부분 해석은 명령 후 10초 이후에는 timeout, clientOption 적용 그리고, 클러스터 리다이렉트 횟수 지정을 하고 가능한 읽는 부분을 Replica에서 처리하려고 합니다. (Master 영향을 덜 가게 / MonogoDB에도 비슷한 옵션이 권장 됩니다.)

 

이렇게 설정하면 연결시 사용할 수 있습니다. 당연하겠지만 Lettuce는 ReactiveRedisConnectionFactory의 구현체중 일부이므로 이렇게 사용 할 수 있습니다.

 

@Data
@NoArgsConstructor
@ConfigurationProperties(prefix = "spring.data.redis.cluster")
@Configuration
class RedisInfo {
    private int maxRedirects;
//  로컬 레디스라 PassWord 부분은 없습니다.
    private List<String> nodes;
}

 

레디스 연결을 위한 DTO 객체

 

이런식으로 사용하면 레디스를 구성 할 수 있습니다.

 

@Component
public class RedisAdapter implements SavePort {

    private ReactiveHashOperations<String,String, Object> redisOperations;
    public RedisAdapter(ReactiveHashOperations<String,String, Object> redisOperations) {
        this.redisOperations = redisOperations;
    }
    @Override
    public Mono<Boolean> save(TokenEntity tokenEntity) {
        return redisOperations.put("TOKEN",UUID.randomUUID().toString(), tokenEntity);
    }
}

 

그리고, 위와 같이 실제 사용처에서 가공하여 사용 할 수 있습니다.

 

 

[참고 출처]

 

Lettuce Reference Guide

Connections to a Redis Standalone, Sentinel, or Cluster require a specification of the connection details. The unified form is RedisURI. You can provide the database, password and timeouts within the RedisURI. You have following possibilities to create a R

lettuce.io

 

Getting Started | Accessing Data Reactively with Redis

Although you can package this service as a traditional WAR file for deployment to an external application server, the simpler approach shown here creates a standalone application. You package everything in a single, executable JAR file, driven by a good ol

spring.io

 

[코드]

https://github.com/1ComputerMaster/codeStudy/tree/main/Gateway-AuthorizationServer