2012-11-06 2 views
12

사실, 나는 3 개의 Redis 인스턴스를 가지고 있으며이 인스턴스를이 500MB + dump.rdb에 저장했습니다. Redis 서버는이 dump.rdb를 읽을 수 있으며 모든 것이 정상적인 것처럼 보입니다. 그런 다음 redis-server 비용이 5.0GB 이상의 메모리를 소비한다는 것을 알았습니다. 나는 이유를 모른다.500MB Redis dump.rdb 파일에 약 5.0GB 메모리가 필요한 이유는 무엇입니까?

내 파일에 문제가 있습니까? 내 DB에는 약 3 백만 개의 키가 있고 각 키의 값에는 약 80 개의 정수가 들어있는 목록이 있습니다.

나는이 METHOD을 사용하여 3 개의 인스턴스를 결합합니다.

추 신 : 동일한 크기 및 동일한 키 - 값 구조를 가진 또 다른 dump.rdb는 단지 1GB 메모리입니다.

내 데이터는 keyNum -> {num1, num2, num3, ...}처럼 보입니다. 모든 숫자는 1 ~ 4,000,000입니다. 목록을 사용하여 저장해야합니까? 지금은 lpush (k, v)를 사용합니다. 이 방법이 너무 많이 들었나요?

답변

0

더 많은 내용이있을 수 있지만 Redis는 덤프 파일을 압축한다고 생각합니다.

+0

예 데이터를 압축합니다. 500MB에서 5.0GB로 지금은 내 프로그램을 시작할 수 없습니다 .--( – wyp

15

덤프 크기에 대한 메모리의 비율은 Redis가 내부적으로 사용하는 데이터 형식에 따라 다릅니다.

작은 개체 (해시, 목록 및 정렬 집합)의 경우 redis는 ziplists를 사용하여 데이터를 인코딩합니다. 정수로 이루어진 작은 세트의 경우 redis는 Intsets를 사용합니다. ZipLists 및 IntSet은 메모리에 저장된 것과 동일한 형식으로 디스크 에 저장됩니다. 따라서 데이터에서 이러한 인코딩을 사용하는 경우 1 : 1의 비율을 기대할 수 있습니다.

큰 개체의 경우 메모리 내 표시가 디스크에있는 표시와 완전히 다릅니다. 디스크상의 포맷은 압축되어 있고, 포인터를 가지고 있지 않으며, 메모리 단편화를 다룰 필요가 없습니다. 따라서 개체가 클 경우 디스크 대비 10 : 1의 메모리 비율이 정상이며 예상됩니다.

어떤 개체가 메모리를 차지하는 지 알고 싶으면 redis-rdb-tools을 사용하여 데이터를 프로파일 링하십시오. 거기에서 memory optimization notes on redis.iomemory optimization wiki entry on redis-rdb-tools을 따르십시오.

관련 문제