Почему извлечение ключей и хэшей из Redis происходит так медленно? - PullRequest
0 голосов
/ 22 марта 2019

Я использую библиотеку StackOverflow.Redis для взаимодействия с сервером Redis Azure для извлечения некоторых хеш-значений для доступа через веб-API.Вот как я это делаю:

        IDatabase cache = lazyConnection.Value.GetDatabase();
        var server = lazyConnection.Value.GetServer(lazyConnection.Value.GetEndPoints().First());
        var starterKeys = server.Keys(pattern: "Monitor:*");
        var count = 0;
        foreach (var starterKey in starterKeys)
        {
            var hashEntries = cache.HashGetAll(starterKey);
            foreach (var hashEntry in hashEntries)
            {
                //put values into my model here...
            }
            count++;
        }

Есть ровно 22 ключа, которые соответствуют шаблону "Monitor:*" (найдено путем отладки и просмотра значения count в конце).Однако этот фрагмент кода, извлекающий эти 22 ключа и хэша, занимает 55 секунд .Значения хеша тоже не очень велики.В каждом хэше содержится около 19 пар ключ-значение (например, имя, компания, адрес электронной почты, телефон и т. Д. Ничего особенного).

Почему это так долго?Я подумал, что одной из причин использования Redis было быстрое снижение нагрузки на базу данных за счет хранения агрегированных данных.Я мог бы установить это в своей базе данных и запросить его (даже с объединениями для получения агрегированных данных), и мой процесс был бы значительно быстрее, чем 55 секунд.

Я что-то здесь не так делаю?Или я не понимаю цели или правильного использования Redis?

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

1 Ответ

0 голосов
/ 09 июля 2019

если вам нужны все KEY *, сохранение их в значении увеличит скорость. Вы можете оставить объект под AllKeys для отображения всех клавиш.

SetAllObject

 cache.StringSetAsync("AllKeys", JsonConvert.SerializeObject(obj));

GetAllObject

JsonConvert.DeserializeObject<List<TEntity>>(await cache.StringGetAsync("AllKeys")).ToList();
...