Структуры данных фиксированной длины в Redis - PullRequest
0 голосов
/ 05 февраля 2020

Мне нужно сопоставить десятки тысяч 4-байтовых строк с одним или несколькими логическими значениями. Я не против использовать целое слово для логических значений, если это означает более быстрый поиск. Однако у меня есть такие жесткие ограничения для моих данных, я думаю, что есть некоторые, хотя и незначительные, оптимизации, которые могут быть сделаны, если об этом заранее сообщать в механизм хранения. Есть ли у Redis какой-либо способ воспользоваться этим?

Вот пример моих данных:

"DENL": false
"NLES": false
"NLUS": true
"USNL": true
"AEGB": true
"ITAE": true
"ITFR": false

Ключи представляют собой конкатенацию двух ISO 3166-1 alpha- 2 кода . Таким образом, они гарантированно будут состоять из 4 заглавных букв Engli sh.

Структуры данных, которые я рассмотрел, используют:

  • Хэши для сопоставления 4-байтовых ключей со строкой, представляющей логические значения
  • Отдельный набор для каждого логического значения

И поскольку мои данные содержат только прописные буквы Engli sh и существует только 456976 возможных комбинаций из них (что 56 КБ на бит, хранимые на ключ):

  • Одна или несколько строк, к которым осуществляется доступ с помощью побитовых операций (GETBIT, BITFIELD) с использованием функции для преобразования строки ключа в битовый индекс.

Я думаю, что множества, вероятно, являются наиболее элегантным решением, и двоичная строка для всех возможных комбинаций будет наиболее эффективной. Я хотел бы знать, есть ли там какой-то золотой середины? Как набор с фиксированной длиной строки в качестве членов. Я ожидаю, что тип данных, оптимизированный для строк фиксированной длины, сможет обеспечить более быстрый поиск, чем тип данных, оптимизированный для строк переменной длины.

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Чуть лучше использовать четырехбуквенную комбинацию кода страны в качестве простого ключа с пустым значением.

Тип данных set действительно является га sh карта, где ключи являются элементом и добавляются к карте ha sh со значением NULL. Я бы не стал использовать set , поскольку это подразумевает хэши и два поиска в карте ha sh: первый для ключа set в базе данных и второй для ха sh внутренний для набора для элемента.

Используйте наличие ключа как либо «нужна таможенная декларация», либо «не нужна таможенная декларация», как говорит Томаш.

Использование простых клавиш позволяет использовать команду SET с условиями NX / XX, что может быть удобно в вашей логике c:

  • NX - Устанавливать ключ только в том случае, если он * еще не существует.
  • XX - Устанавливайте ключ только в том случае, если он уже существует.

Используйте команду EXISTS вместо GET, так как она немного быстрее (без ввода проверка, нет значения извлечения).

Другое преимущество простых ключей по сравнению с множествами состоит в том, чтобы получить значение нескольких ключей одновременно, используя MGET:

> MGET DENL NLES NLUS
1) ""
2) ""
3) (nil)

Для возможности выполнения сложных запросов. При условии, что они редки и не оптимизированы для производительности, вы можете использовать SSCAN (если вы go с устанавливает ) или KEYS (если вы go с простыми ключами). Однако, если вы используете go с простыми ключами, вам лучше использовать выделенную базу данных, см. SELECT.

Чтобы запросить тех, кто имеет NL слева, вы должны использовать:

KEYS NL??
1 голос
/ 05 февраля 2020

Есть несколько вариантов оптимизации, которые вы можете попробовать:

  1. использовать набор и обрабатывать все значения как «нужно таможенное декларирование» или «не нужно таможенное декларирование» - в зависимости от того, какое из них имеет меньше ценностей; затем с помощью SISMEMBER вы можете проверить, находится ли ваш ключ в этом наборе, который дает правильный ответ,
  2. взгляните на введение в типы данных Redis, глава "Растровые изображения" - если вы предварительно определили все свои ключи в некотором массиве, вы можете использовать операции SETBIT и GETBIT , чтобы сохранить флаг "требуется таможенная декларация" для данного номера бита (индекс в массив).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...