Spring

redis-cli에서 수동으로 설정 한 값을 검색 할 수 있지만 Spring Boot에서 Redis Reactive를 통해 새 키를 설정할 수 없음

기록만이살길 2021. 3. 16. 07:03
반응형

redis-cli에서 수동으로 설정 한 값을 검색 할 수 있지만 Spring Boot에서 Redis Reactive를 통해 새 키를 설정할 수 없음

1. 질문(문제점):

저는 Spring Webflux + Reactive Redis를 사용하고 있으며, 제 목표는 Redis를 파일 캐시로 사용하는 것입니다.

처음에는 ~ 100MB ByteBuffer로 키를 설정하려고했지만 작동하지 않았습니다. 디버거를 다시 확인하여 파일이 실제로 메모리로 읽혀 지는지 확인했습니다. "어쩌면 Redis는"큰 "문자열을 좋아하지 않을까요?"라고 생각했습니다. 그래서 아래 코드로 시도했지만 여전히 주사위가 없습니다. ACL 관련 문제 일 수 있다고 생각했지만 확인했고 기본 사용자가 모든 것에 액세스 할 수 있습니다. "어쩌면 Spring이 Redis에 액세스 할 수 없습니까?" 아니요, redis-cli에서 MONITOR 출력을 확인했는데 GET 명령이 정상적으로 수신되고 있지만 SET 명령의 흔적은 없습니다. 어떤 제안?

내 컨트롤러는 다음과 같습니다.

@RequestMapping(value = "/prime", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Mono<String> prime() {
    reactiveStringCommands.set(ByteBuffer.wrap("testkey2".getBytes()), ByteBuffer.wrap("test".getBytes()));

    return reactiveStringCommands.get(ByteBuffer.wrap("testkey".getBytes())).map(bb -> new String(bb.array()));
}

application.properties의 관련 설정 :

spring.redis.host=localhost
spring.redis.password=<password>
spring.redis.port=6379

redis-cli 출력 (testkey가 CLI에서 수동으로 설정되었으며 testkey2의 흔적이 없음) :

127.0.0.1:6379> keys *
1) "testkey"
127.0.0.1:6379> ACL list
1) "user default on #<password> ~* +@all"
127.0.0.1:6379> monitor
OK
1610406175.250768 [0 172.17.0.1:39104] "GET" "testkey"

편집 : 스택 추적이나 콘솔에 출력되는 오류 유형이 없음을 언급하는 것을 잊었습니다.

2. 해결방안:

반응의 첫 번째 규칙 : 구독 할 때까지 아무 일도 일어나지 않습니다.

명령 적 관점에서 보면 코드가 괜찮아 보이지만 반응 적 관점에서는 올바르지 않습니다.

set 명령의 영향을 볼 수없는 이유는 구독하는 것이 없기 때문입니다.

다음과 같이이 두 문장을 결합해야합니다.

public Mono<String> prime() {
    retur reactiveStringCommands.set(ByteBuffer.wrap("testkey2".getBytes()), ByteBuffer.wrap("test".getBytes()))
            .then(reactiveStringCommands.get(ByteBuffer.wrap("testkey".getBytes())).map(bb -> new String(bb.array())));
}

이런 식으로 Spring은 내부적으로 결과 Mono를 구독하고 차례로 체인의 모든 연산자 / 단계 (set 명령 포함)를 구독합니다.

65675843
반응형