Выполнение поиска в кэшированных объектах Redis

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

У меня есть список, который я думаю о кэшировании через Redis. Эти должности являются типичными корпоративными должностями, такими как «бухгалтер», «сетевой администратор», «директор по персоналу» и т. д. Со временем таких должностей будет тысячи.

Я также хочу реализовать функцию автозаполнения, когда пользователь вводит несколько символов «Директор», я хочу начать вносить предложения. Кстати, должность НЕ обязательно должна начинаться со слова «директор». Другими словами, «Директор» может быть в середине или в конце, как в случае «Директор по персоналу».

Мои позиции хранятся в базе данных SQL Server. Я чувствую, что если бы мне пришлось обрабатывать эту функцию автозаполнения для данных в SQL Server, я столкнулся бы с проблемами производительности.

Я чувствую, что кэширование ВСЕХ моих позиций в Redis и выполнение автозаполнения для кэшированных данных в Redis должно дать мне наилучшую производительность. Однако я никогда не выполнял поиск по данным Redis.

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

P.S. Мое приложение представляет собой приложение ASP.NET MVC, написанное на C# и размещенное в Azure.


person Sam    schedule 02.02.2016    source источник


Ответы (1)


Вы можете получить Sorted Set как лексикографически отсортированный набор строк, просто вставив одинаковую оценку для всех элементов.

См. лексикографические оценки в документации Redis.

Затем вы можете выполнить поиск, перебирая элементы, соответствующие заданному шаблону в стиле glob, с помощью команды ZSCAN.

Например, для StackExchange.Redis:

var cnn = ConnectionMultiplexer.Connect("localhost");
var db = cnn.GetDatabase();
var key = "positions";
db.SortedSetAdd(key, "Accounting Clerk", 0);
db.SortedSetAdd(key, "Network Administrator", 0);
db.SortedSetAdd(key, "HR Director", 0);
var entries = db.SortedSetScan(key, "*Director*");

Также с CachingFramework.Redis немного короче:

var ctx = new Context("localhost");
var lexSet = ctx.Collections.GetRedisLexicographicSet("positions");
lexSet.AddRange(new [] { "Accounting Clerk", "Network Administrator", "HR Director" });
var entries = lexSet.Match("*Director*");
person thepirat000    schedule 02.02.2016