StackExchange Redis Поиск по коллекции - PullRequest
0 голосов
/ 18 октября 2019

Мы рассмотрим использование Redis, размещенного в Azure. Используя nuget StackExchange, наш первый вариант использования - это поиск по нашей клиентской базе. Первоначально это около 10000 клиентов, но со временем будет расти.

Заказчиком будет определенная модель поиска, примерно такая:

    {
     "Id": 123,
     "Name": "Bob Smith",
     "Age": 72,
     "Postcode": "AB123EF",
     "Email": "bobsmith@anon.com",
     "Telephones": [
        "07710123456", 
        "01453123456"
      ]
    }

Насколько я понимаю, вам следует избегать ввода больших объектов BLOB-объектов в Redis, поэтому сохранение списка в виде одного объектане очень хорошая идеяПоэтому мы использовали функции List * для хранения каждого элемента под ключом и сериализации данных.

Первоначальная работа выглядит примерно так:

    var tasks = new List<Task>();

    foreach (var customer in customers)
    {
     tasks.Add(db.ListLeftPushAsync(_key, JsonConvert.SerializeObject(customer)));
    }

    await Task.WhenAll(tasks).ConfigureAwait(true);

Все это работает, как мы ожидаем, яЯ уверен, что есть некоторая оптимизация, но, похоже, все в порядке.

Это принципиально поставило нас перед вопросом запроса информации. Я понимаю, что Redis хранит все как строку, но я не понимаю, как искать в списке, так как это объект Redis, а не строка. Так что мы не можем использовать ListRange(_key).Where(c => c.Contains("Bob")) например.

Пожалуйста, дайте мне знать, если наш подход неверен в этом или есть метод, который я просто пропускаю.

1 Ответ

1 голос
/ 23 октября 2019

Я полностью согласен с тем, что @GuyKorland сказал, что вы должны использовать зрелый продукт, такой как RediSearch, чтобы не реализовывать пользовательскую поисковую систему, основанную на redis.

Однако,Я очень рад просто рассказать о том, как реализовать простую поисковую систему с использованием структуры данных Redis, основываясь только на моих знаниях о Redis.

Во-первых, как хранить данные о клиентах, например, о вашем клиенте. в редис. Вы знаете, redis - это база данных KV в памяти, так что вы можете сохранять объект или данные json в виде структуры redis Hash со своим ключом, используя уникальный префикс Id &, как показано ниже.

CUSTOM#123 => 
  Id => 123
  Name => Bob Smith
  Age => 72,
  Postcode => AB123EF
  Email => bobsmith@anon.com
  Telephones#0 => 07710123456
  Telephones#1 => 01453123456

Во-вторых, чтобы построить индексы для всех свойств класса объекта, используя структуру redis List или Sorted Set, как показано ниже.

Например, используя List для Name иAge свойства. Идея состоит в том, чтобы использовать префикс, такой как NAME concat, значение Name объекта, такого как Bob, с символом #, чтобы создать ключ redis и сохранить значение Id как элемент redis List.

\\ To build `NAME` index for all objects contains `Bob`, `Smith` and `Bob Smith` in the `Name` propertory
NAME#Bob => 123, ... 
NAME#Smith => 123, ...
NAME#Bob Smith => 123, ...
\\ Do the same operation above to build `AGE` index
AGE#72 => 123, ...

Наконец, вы можете искать Bob в ключах redis с префиксом NAME#, используя команду GET NAME#Bob, чтобы получить список клиентов Id точно, или команду keys NAME#Bob*, чтобы получитьсписок клиентов Id нечеткий, то вы можете непрерывно получать эти данные клиента, содержащие свойство Name со значением Bob. Если вы хотите отсортировать список клиентов Id, вы должны использовать Sorted Set вместо List для сортировки результатов списка Id.

Я все же рекомендовал вам использовать зрелый продукт на основена Redis, например, RediSearch, это поможет вам быстро реализовать ваши потребности.

...