Helpers - компьютеры, интернет, программирование

StackExchange.Redis Scan x количество ключей

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

string[] keysArr = keys.Select(key => (string)key).ToArray();

Но из-за того, что у меня много ключей, это занимает много времени. Я хочу ограничить количество считываемых ключей. Итак, я пытаюсь запустить команду выполнения, в которой я получаю 100 ключей за раз:

var keys = Redis.Connection.GetDatabase(dbNum).Execute("scan", 0, "count", 100);

Эта команда успешно выполняет команду, однако не может получить доступ к значению, поскольку оно является закрытым, и не может привести его, даже если классы RedisResult предоставляют для него явное приведение:

public static explicit operator string[] (RedisResult result);

Любые идеи, чтобы получить x количество ключей за раз от Redis?

Спасибо


Ответы:


1

Я бы использовал метод .Take(), описанный Microsoft здесь.

Возвращает указанное количество непрерывных элементов от начала последовательности.

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

//limit to 100
var keysArr = keys.Select(key => (string)key).Take(100).ToArray();
25.07.2018
  • Как мне получить следующую сотню? из команды сканирования вы получаете хэш для следующего запроса 25.07.2018
  • @Person, вам нужно будет реализовать подпрограмму подкачки .Skip(), например: перебирать ienumerable партиями"> stackoverflow.com/questions/15414347/ 25.07.2018
  • использование skip и take here для получения страниц... откровенно говоря... будет очень плохим в этом сценарии; это намерение не может быть выражено серверу, поэтому вы реализуете треугольный запрос (что означает: первые элементы дешевы, следующая страница дороже и так далее... до тех пор, пока последняя страница не станет абсурдно дорогой). Это не лучший способ решить эту проблему в данном конкретном случае 25.07.2018
  • @MarcGravell Я думаю, это зависит от объема желаемого результата. Это не обязательно плохо, если вам нужно всего несколько сотен. 25.07.2018

  • 2

    SE.Redis имеет метод .Keys() в IServer API, который полностью инкапсулирует семантику SCAN. Если возможно, просто используйте этот метод и потребляйте данные по 100 за раз. Обычно довольно легко написать функцию пакетной обработки, т.е.

    ExecuteInBatches(server.Keys(), 100, batch => DoSomething(batch));
    

    с участием:

    public void ExecuteInBatches<T>(IEnumerable<T> source, int batchSize,
            Action<List<T>> action)
    {
        List<T> batch = new List<T>();
        foreach(var item in source) {
            batch.Add(item);
            if(batch.Count == batchSize) {
                 action(batch);
                 batch = new List<T>(); // in case the callback stores it
            }
        }
        if (batch.Count != 0) {
            action(batch); // any leftovers
        }
    }
    

    Перечислитель будет беспокоиться о продвижении курсора.


    Вы можете использовать Execute, но это требует много работы! Кроме того, SCAN не гарантирует, сколько будет возвращено на страницу; это может быть ноль - это может быть в 3 раза больше, чем вы просили. Это ... только руководство.

    Между прочим, причина неудачного приведения заключается в том, что SCAN не возвращает a string[] - он возвращает массив из двух элементов, первый из которых является "следующим" курсором, а второй - ключами. Так что, может быть:

    var arr = (RedisResult[])server.Execute("scan", 0);
    var nextCursor = (int)arr[0];
    var keys = (RedisKey[])arr[1];
    

    Но все, что мы делаем, это повторно реализуем IServer.Keys, трудный путь (и значительно менее эффективный - ServerResult не идеальный способ хранения данных, он просто необходим в случай Execute и ScriptEvaluate).

    25.07.2018
    Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..