redis cluster 는 pipeline 의 실현 방향 을 지원 합 니 다.

3751 단어 redisclusterpipeline
파이프 라인 이 뭐야?파이프 라인 을 왜 써?
지난 글 에서 소개 해 드 렸 어 요redis 는 왜 pipeline 기능 을 제공 합 니까? 오늘 redis cluster 를 보급 하 는데 어떻게 pipeline 을 지원 합 니까?
파이프(pipeline)는 클 라 이언 트 클 라 이언 트 와 서버 측의 상호작용 을 단 방향 전송 요청(Send Request)과 수신 응답(Receive Response)으로 명확 하 게 구분 합 니 다.사용 자 는 여러 동작 을 서버 에 연속 으로 보 낼 수 있 지만 이 기간 에 서버 측은 모든 조작 명령 에 응답 데 이 터 를 보 내지 않 습 니 다.모든 요청 이 끝 난 후 사용 자 는 요청 을 닫 고 모든 작업 명령 의 응답 결 과 를 받 기 시작 합 니 다.
파이프(pipeline)는 일부 장면 에서 매우 유용 하 다.예 를 들 어 여러 개의 조작 명령 이 서버 에 신속하게 제출 되 어야 하지만 사용 자 는 모든 조작 이 되 돌아 오 는 응답 결과 에 의존 하지 않 고 결과 에 대한 응답 도 즉시 얻 을 필요 가 없다.그러면 파 이 프 는 성능 을 최적화 하 는 일괄 처리 도구 로 사용 할 수 있다.성능 이 향상 되 는 이 유 는 주로 TCP 연결 에서 의 상호 왕복 비용 을 줄 였 기 때문이다.
그러나 프로그램 에서 파 이 프 를 사용 할 때 pipeline 을 사용 할 때 클 라 이언 트 는 서버 와 의 연결 을 독점 합 니 다.이 기간 에 pipeline 이 닫 힐 때 까지 다른'비 파이프'형식 으로 작업 할 수 없습니다.다른 작업 을 동시에 수행 하려 면 pipeline 작업 에 따로 연결 을 만들어 일반적인 작업 과 분리 할 수 있 습 니 다.
우리 가 key 를 조작 하려 고 할 때 redis pipline 을 통 해 다시 실행 한 후에 모든 결 과 를 한꺼번에 읽 어서 네트워크 전송 소 모 를 적 게 할 수 있 습 니 다.이 키 의 실행 은 같은 연결 에 있어 야 한 다 는 것 이 분명 합 니 다.
배 치 된 redis 가 standalone 이나 master-slave 구조 일 때 괜 찮 습 니 다.pool 에서 꺼 낼 수 있 는 연결 은 모두 master 노드 입 니 다.그러면 redis cluster 일 때 어떻게 합 니까?이 키 들 은 같은 redis node 에 있 을 수도 있 고 여러 redis nodes 에 분 산 될 수도 있 습 니 다.이렇게 하면 여러 개의 연결 입 니 다.
redis cluster 는 자동 으로 key 를 나 누 었 지만 client 에 대한 요구 가 높 습 니 다.클 라 이언 트 가 모든 cluster 안의 노드(이것 은 db client 방안 과 유사 합 니 다)를 연결 하고 slots 배분 정 보 를 캐 시 한 다음 에 클 라 이언 트 가 같은 알고리즘 으로 hash 를 한 후에 키 의 slot 를 정 하여 slot 가 속 한 redis 노드 를 찾 아야 합 니 다.그리고 해당 노드 의 연결 전송 명령 을 가 져 옵 니 다.
cluster pipeline 실현 사고
자바 에서 자주 사용 하 는 클 라 이언 트 jedis 는 redis-cluster 기능 을 제공 하지만 cluster 에서 pipeline 능력 을 제공 하지 않 습 니 다.봉 인 된 JedisClusterCRC 16 도 구 를 통 해 slot 포 지 셔 닝 에 대응 하 는 redis node 의 연결 을 계산 하고 redis node 에 따라 이 key 를 그룹 으로 나 누 면 각 그룹의 key 는 각각 pipeline 논 리 를 진행 할 수 있 습 니 다.
의사 코드

static List<Integer, HostAndPort> slot2NodeMap; //         Jedis.clusterNodes  slot    ,      

List<Object> clusterPipeline(List keys) {
	 Map<HostAndPort, List<String>> node2Keys= new HashMap<>();  //     keys  
	for(String key : keys) {
	   //   key   slot
	   int slot = JedisClusterCRC16.getSlot(key); 
	   //   slot         ,      key    
	  node2Keys.get(slot2NodeMap.get(slot)).add(key);
	}

    List<Object> results = new ArrayList();
	//     
	for (Map.Entry<HostAndPort, List<String>> group : node2Keys) {
		Jedis jedis =  JedisClusterConnectionHandler.getConnectionFromNode(group.key);
		PipeLine pipeline = jedis.pipelined();
		//     keys 
		 result.addAll(jedis.syncAndReturnAll());
	}
   return results;
}
메모:cluster 에서 pipeline 을 실행 하면 redis 노드 확장 용 중도 redirection 전환 연결 로 인해 결과 가 손실 될 수 있 습 니 다.attempts 재 시도 횟수 를 0 으로 설정 하여 자동 으로 연결 을 전환 하여 이상 을 감지 한 후 업무 가 주동 적 으로 재 시도 할 수 있 습 니 다.
jedis 공식 지지?
github 에 서 는 사실 2017 년 에 클 러 스 터 pipeline 의 pr 를 제출 했 습 니 다.관리자 들 도 merge 를 좋아 합 니 다.하지만~후속 적 으로 따라 가 는 것 이 느 렸 습 니 다.그리고 19 년 동안 merge review 때 이상 이 있 었 고 제출 자 도 따라 가지 못 해서 합병 에 성공 하지 못 했 습 니 다.
https://github.com/redis/jedis/pull/1455


cluster pipeline 을 실현 하 는 것 도 이 pr 의 제출 코드 를 참고 할 수 있 습 니 다.
이상 은 redis cluster 가 pipeline 의 실현 방향 을 지원 하 는 상세 한 내용 입 니 다.redis cluster 가 pipeline 을 지원 하 는 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기