2016-06-06 3 views
4

Redis를 처음 사용하고 Java 응용 프로그램이 실행되는 동안 클라이언트 연결을 여는 것이 좋은 방법인지 알고 싶습니다. 이 연결은 다양한 기능에 사용됩니다.응용 프로그램 수명 당 하나의 연결 만 허용

또는 대체 방법이 더 좋습니다. 메서드에 대한 각 연결 범위를 지정하면 연결, 설정 또는 가져 오기가 끝나고 연결이 닫힙니다.

원하는 접근 방식은 어느 것입니까?

감사합니다.

참고 : 나는 lettuce 레디 스 클라이언트 열려 연결을 유지하려는 것이다 databaseish 서버에 대부분의 연결과 마찬가지로

+1

아마도 c) 열린 상태로 유지되는 전체 연결 풀. 좁은 범위 = 연결 설정 중 많은 시간이 손실 됨 – zapl

+0

@zapl 귀하의 의견을 통해 내가 사용하고있는 라이브러리에서 풀 인터페이스를 찾을 수있게되었습니다. 감사. 나는 당신이 1 개를 배치하는 경우에 당신의 응답을 받아 들일 것입니다. – sargas

답변

4

을 사용하고 있습니다. Reconnection은 1 개의 요청 패킷을 보내고 1 개의 응답 패킷을 거의 즉시 반환하는 것과 비교할 때 많은 시간과 TCP 패킷을 필요로합니다.

연결 관리는 일반적으로 풀 구현에 의해 수행됩니다. 상추의 경우 docs state

lettuce는 Redis Standalone 및 Redis Sentinel 관리 연결에 대한 연결 풀링을 제공합니다. 상추를 사용할 때 풀링이 필요하지는 않지만 일부 시나리오에서는 편리 할 수 ​​있습니다. 양상추 연결은 수명이 길고 자동 재 연결을 특징으로합니다. 여러 스레드가 하나의 연결을 동시에 사용할 수 있습니다.

이 경우에는 풀을 생성하지 않아도됩니다. Redis는 단일 스레드입니다. & jedis과 같은 다른 라이브러리에서는 연결이 스레드로부터 안전하지 않기 때문에 풀을 사용하려고합니다.


코멘트에 주석이 있음을 지적 했으므로 여러 연결을 사용해야하는 경우도 있습니다. 또한 같은 문서에서 위에 링크 :

당신은 BLPOP, BRPOP로, ... 전체 연결을 차단하지 않도록 차단 호출을 사용합니다. 연결이 차단 명령에 의해 차단되면 레디 스 점점 요소를 (이 명령은 레디 스 '단일 스레드를 차단하지 않는

, 그들은 발생하는 특정 이벤트에 대기 결과에 응답 할 때까지,이 상태로 유지됩니다 목록에 추가됨). 따라서 &은 다른 연결에서 Redis와 상호 작용해야합니다. 그렇게하지 않으면 속도가 느려집니다.하지만 : 유일한 클라이언트이고 이벤트를 발생시키는 데이터를 작성할 계획이라면 작성하기 전에 무언가를 읽고 싶다면 교착 상태가 될 수 있습니다.

거래 (MULTI/EXEC)를 사용합니다. 트랜잭션은 트랜잭션 상태에서 연결을 전환합니다. 연결을 공유하는 다른 스레드는 실수로 트랜잭션으로 넘어갑니다.

이 경우 코드의 정확성에 영향을주기 때문에 기본적으로 여러 연결을 사용해야합니다. 갑자기 null 값이 transactions 동안 반환되는 것은 값이 저장되지 않았다는 것을 의미하지 않습니다. 반환 값을 확인하지 않아도 변경 사항은 사용자가 알아 차리지 않고 롤백 될 수 있습니다.

+1

일반적으로 대답에 동의하지만 풀링 사용은 사용 사례에 따라 다릅니다. 연결 풀링을 사용하는 것이 트랜잭션을 사용하거나 작업을 차단하는 것이 좋습니다. 다른 모든 경우에 풀링은 자원 낭비 일뿐입니다. 양상추 연결은 자동 재 연결을 제공하므로 상상력 사용자는 끊어진 연결을 볼 수 없습니다 (단절된 연결의 명령을 거부하도록 양상치가 구성되어 있지 않은 경우). – mp911de

1

redis 연결을 열린 상태로 유지하는 것이 더 좋습니다. 또한 연결이 열린 상태로 유지되면 비동기 적으로 작동하는 프로그램에 대해서는 문제가 발생하지 않습니다.

관련 문제