Мне нужен совет. Я пытаюсь сохранить некоторые данные в очень эффективном режиме памяти с помощью redis и хэшей (тип redis). Есть несколько списков случайных строк (средний размер - 40 символов, но max - 255 символов в rfc) - это идентификатор файла, например, у нас есть список 100kk file_id. Также мы должны отслеживать 2 Params для каждого идентификатора: DOWNLOAD_COUNT (INT, увеличивается на единицу) и server_id - крошечное ИНТ Redis CONFIG добавляют:Redis сохраняет данные эффективно (хеши)
hash-max-ziplist-entries 1024
Во-первых, мы отвергаем хранить данные как есть (палин текст), огромные накладные расходы :
file_id(40 byte) + download_count + server_id) * 100kk + redis pointers --no need to calculate at all.
во-вторых, использовать некоторые 128bit хэш-функцию и сохранить как с Redis хэш: но есть некоторые накладные расходы тоже, но меньше, чем в 1 один.
И, наконец, мы получаем что-то вроде этого, с Redis хэша:
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
Так есть 100k ведра вообще, поэтому на данный момент мы можем получить столкновение, например: (катаракта сталкивается с perit) благодаря link, и данные попадают в одни и те же ведра, но есть хеш crc32 для полей, и теоретически мы не можем получить столкновение в этой точке (меньше вероятности), может ли эта схема теоретически быть сопротивлением столкновению, равным, например, 64-битовому хешу?
Но это не очень эффективная схема памяти, так что мы могли бы получить что-то вроде этого (с одной поданной):
hmset(bucket, crc32(file_id as server_id_and_download_count_field), value1+’--’+value2)
Таким образом, мы не можем использовать приращение функции, но мы уменьшаем поля и использование памяти, и нужен некоторый процессор для анализа результата и обновления его с новыми значениями (incremented download_count), может быть, мы могли бы использовать lua, чтобы сделать некоторые встроенные манипуляции с этим?
Так что мой вопрос: Является ли это сильное сопротивление столкновений (для 100kk данных) или, возможно, мы должны использовать некоторую 64 битную хэш-функцию в полях (не CRC32), но то, что о том, когда мы будем иметь 1 миллиард строк будут достаточно сильны для этих данных?
Возможно, есть более эффективная схема?
Спасибо!