Я новичок в использовании Redis DB. После прочтения некоторых документов и изучения некоторых примеров в Интернете, а также сканирования stackoverflow.com, я вижу, что Redis работает очень быстро, хорошо масштабируется, но это стоит того, что нам нужно подумать о том, как наши данные будут доступ к ним во время разработки и какие операции они должны будут пройти. Это я могу понять, но я немного запутался в поиске в данных того, что было так легко, как бы медленно, с простым старым SQL. Я мог бы сделать это одним способом с помощью команды KEY, но это операция O (N), а не O (log (N)). Поэтому я потерял бы одно из преимуществ Redis.
Что говорят здесь более опытные коллеги?
Возьмем пример использования: нам нужно хранить личные данные приблизительно. 100 000 человек, и эти данные нужно искать по имени, номер телефона.
Для этого я бы использовал следующие структуры:
1. SET for storing all persons' ids {id1, id2, ...}
2. HASH for each person to store personal data and name it
like map:<id> e.g. map:id1{name:<name>, phone:<number>, etc...}
Решение 1:
1. HASH for storing all persons' ids but the key should be the phone number
2. Then with the command KEY 123* all ids could be retrieved who have a phone number
sarting with 123. On basis of the ids also the other personal data could be retrieved.
3. So forth for each data to be searched for a separate HASH should be created.
Но главный недостаток этого решения заключается в том, что атрибут должен также быть уникальным, так что присвоение номера телефона и идентификаторов в HASH будет однозначна. С другой стороны, время O (N) не является идеальным.
Кроме того, это использует больше места, чем было бы необходимо, а команда KEY ухудшает производительность доступа. (http://redis.io/commands/keys)
Как это сделать правильно? Я мог бы также предположить, что идентификаторы будут проходить в ZSET, а данные, необходимые для поиска, могут быть оценками, но это позволяет работать только с диапазонами, не связанными с серасимами.
Спасибо заранее, привет, Тамас
Резюме ответов: На самом деле оба ответа указывают, что Redis не был предназначен для поиска значений ключей. Если этот случай использования необходим, то необходимо использовать обходные пути, как показано в моем исходном решении или в приведенном ниже решении.
Ниже решение от Eli имеет гораздо лучшую производительность, чем моя оригинальная, поскольку доступ к ключам можно считать постоянным, только список идентификаторов должен быть итерирован через, для доступа это даст время O (const). Эта модель данных также позволяет одному человеку иметь тот же номер телефона, что и кто-то еще и т.д. Также для имен и т.д.... так что возможно 1-n отношения (я бы сказал со старой терминологией ERD).
Недостатком этого решения является то, что он потребляет гораздо больше места, чем мой, и номера телефонов, чьи начальные цифры известны, не удалось найти.
Спасибо за оба ответа.