2

귀하의 조언이 필요합니다. 내가 redis 및 해시 (redis 형식) 매우 메모리 효율적인 방법으로 일부 데이터를 저장하려고합니다. 임의의 문자열 목록이 있습니다 (평균 크기는 40 문자이지만 최대 가능 문자 수는 255 문자입니다). 파일 아이디입니다. 예를 들어 100kk file_id list가 있습니다. 또한 우리는 각 ID에 대해 2 PARAMS을 추적해야합니다 : - :데이터를 효율적으로 저장합니다 (해시)

hash-max-ziplist-entries 1024 

는 첫째로 우리는 데이터를 저장을 거부, 거대한 오버 헤드 (페일 린 텍스트)와 같이 다운로드 횟수 (INT, 증가) 및 SERVER_ID 작은 INT를 레디 스 함께 추가 설정 :

file_id(40 byte) + download_count + server_id) * 100kk + redis pointers --no need to calculate at all. 

둘째, 일부 128 비트 해시 함수를 사용하여 레디 스 해시대로 저장하지만 일부 오버 헤드도 존재하지만, 하나 하나 적은 다음.

그리고 마침내 우리는 레디 스 해시, 이런 식으로 뭔가를 얻을 : 우리가 예를 들어 충돌을 얻을 수있는이 시점에서, 그래서

hmset(bucket, server_id_field, value1, download_count_filed, value2), 
server_id_field = crc32(file_id) 
download_count_filed = crc32(file_id) + 1, 
bucket = murmur2(file_id) div 10^5 

그래서, 전혀 100,000 버킷이 있습니다 : 덕분에 (백내장은 perit과 충돌) link 및 데이터가 동일한 버킷에 있지만 필드에 crc32 해시가 있으며 이론적으로이 시점에서 충돌을 얻을 수는 없습니다 (가능성이 낮음).이 스키마는 이론적으로 충돌 저항이 예를 들어 64 비트 해시와 동일 할 수 있습니까?

하지만 정말 효율적인 메모리 방식이 아니므로 우리가 (신청 하나) 같은 것을 얻을 수 :

hmset(bucket, crc32(file_id as server_id_and_download_count_field), value1+’--’+value2) 

그래서 우리는 증가 기능을 사용할 수 없습니다,하지만 우리는 필드와 메모리 사용량을 줄이고, 결과를 구문 분석하고 새 값 (increment_download_count)으로 다시 업데이트하려면 일부 CPU가 필요합니다. 아마도이 기능을 사용하여 루아를 사용하여 내장 조작을 할 수 있습니까?

그래서 내 질문 : 이 (100kk 데이터) 그것을 강력한 충돌 저항을인가 아니면 우리가 10 억 행되는이시기에 대한 몇 가지 64 비트 해시 분야의 기능 (하지 CRC32), 그러나 무엇을 사용해야 이 데이터에 충분히 강합니까?

아마도 더 효율적인 체계가 있습니까?

감사합니다.

답변

0

Redis 해시는이 문제에 매우 적합합니다. Redis doc for HSET 보면 우리는 우리는 또한 레디 스의 모든 문자열에 대한 떨어져 있음을 숙지

HSET myhash field1 "Hello" 

를 참조하십시오. X 문자 (예 : 10) 다음에 file_id을 분할하고 첫 번째 부분은 myhash으로 나머지는 field1으로 사용합니다. 이렇게하면 같은 X 문자로 시작하는 모든 file_ids를 하나의 해시로 축소하고 한 번만 지불하면됩니다. 따라서 귀하의 myhash에 다른 길이로 테스트하고 어떤 가치가 좋은지보십시오.

두 번째해야 할 일은 "Hello" 값을 만드는 것입니다. Redis는 문자열을 좋아하기 때문에 모든 데이터를 하나로 인코딩해야합니다. server_id으로 시작하십시오.이 크기를 바이트 단위로 알고 나서 download_count을 추가하십시오. 파이썬에 있다면 struct.pack()을 쉽게 사용할 수 있습니다.

file_ids에 모든 문자가 있는지 확인할 수도 있습니다.그것들이 부분 집합이라면 그것들을 훨씬 더 조밀 한 형식으로 인코딩 할 수 있으며, 아마도 약간의 문자를 저장할 수 있습니다.

행운을 빈다.