재부팅 후 redis에서 모든 값 (해시, 필드 및 값)을 읽어야하는 버퍼가 있습니다. 빠른 방법으로이를 수행 할 수있는 방법이 있습니까? 약 4 개의 필드가있는 약 10 만개의 해시가 있습니다.hiredis를 사용하여 전체 redis 데이터베이스 인스턴스 덤프
감사합니다.
편집 : 슬로우 방법 : 현재 구현은
HGETALL xxx
모든 필드 '값을 얻을 수
Keys *
를 사용하여 모든 해시를 받고있다.
재부팅 후 redis에서 모든 값 (해시, 필드 및 값)을 읽어야하는 버퍼가 있습니다. 빠른 방법으로이를 수행 할 수있는 방법이 있습니까? 약 4 개의 필드가있는 약 10 만개의 해시가 있습니다.hiredis를 사용하여 전체 redis 데이터베이스 인스턴스 덤프
감사합니다.
편집 : 슬로우 방법 : 현재 구현은
HGETALL xxx
모든 필드 '값을 얻을 수
Keys *
를 사용하여 모든 해시를 받고있다.
이 문제에 접근하는 데는 두 가지 방법이 있습니다.
첫 번째는 설명 된 KEYS/HGETALL 조합을 최적화하는 것입니다. 수백만 개의 키가 없으므로 (100K는 Redis 표준에 비해 그리 높지 않습니다) KEYS 명령은 인스턴스를 오랫동안 차단하지 않으며 100K 항목을 반환하는 데 필요한 출력 버퍼 크기가 적합합니다. 프로그램에서 키 목록을 받으면 가능한 한 빨리 많은 HGETALL 명령을 실행해야합니다. 열쇠는 hiredis (redisAppendCommand/redisGetReply 만 사용)로 구현하기 쉽도록 (예를 들어 1000 개의 항목으로 구성된 동기 배치에서) 파이프 라인하는 것입니다. 100K 항목은 100 왕복으로 만 검색됩니다. 대부분의 Redis 인스턴스는 100K op/s 이상을 유지할 수 있기 때문에 몇 초 이상 지속되어서는 안됩니다. 보다 효율적인 솔루션은 처리량을 최대화하려고 hiredis의 비동기 인터페이스를 사용하는 것이지만 구현하기가 더 복잡합니다. 나는 그것이 100K 항목에 가치가 있는지 확신하지 못합니다.
두 번째 방법은 BGSAVE 명령을 사용하여 Redis 콘텐츠의 스냅 샷을 만들고 생성 된 덤프 파일을 검색 한 다음 파일을 구문 분석하여 데이터를 추출하는 것입니다. 파이썬 구현을 위해 훌륭한 redis-rdb-tools 패키지를 살펴볼 수 있습니다. 이 접근법의 주요 이점은 Redis 인스턴스 (이벤트 루프를 차단하는 KEYS 명령 없음)에 영향을 미치지 않으면 서 일관된 데이터를 검색하는 것입니다.
감사합니다. 사실 제가 설명한 것은 단지 하나의 인스턴스입니다. 나는 12 개의 코어 시스템에서 실행되는 100 개의 다른 인스턴스를 가지고있다. 나는 두 번째 방법을 시도하고 그것이 어떻게 수행되는지 봅니다. 덤프 파일에 대한 c 또는 C++ 기반 파서를 알고 있습니까? 감사! – Vikyboss
c/C++에 없습니다. Redis 코드를 사용하여 코드를 작성하려고합니다. 이전보다 어려워졌지만 여전히 할 수 있습니다. –
느린 방법을 구현 했습니까? –
고마워, 내 편집에 정보를 추가했습니다. – Vikyboss