귀하의 조언이 필요합니다. 내가 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), 그러나 무엇을 사용해야 이 데이터에 충분히 강합니까?
아마도 더 효율적인 체계가 있습니까?
감사합니다.