Redis, отсортированное множество с нумерацией страниц

#javascript #node.js #redis

#javascript #node.js #redis

Вопрос:

В настоящее время у меня в Redis следующая структура данных

 client.hmset('user:'   user.id, 'id', user.id, 'user', JSON.stringify(meta));
client.zadd(['user:user_by_created_time', meta.created_time, 'user:'   user.id]);
client.zadd(['user:user_by_age', meta.age, 'user:'   user.id]);
  

Затем, когда для сортировки первых 10 пользователей по возрасту, когда их больше 10, я должен иметь возможность передать offset , что позволяет мне использовать разбивку на страницы.

В настоящее время у меня есть следующее

 client.zrangebyscore(['user:user_by_age', '-inf', ' inf'], (err, results) => {
    const multi = client.multi();
    results.forEach(result => {
        multi.hgetall(result);
    });

    multi.exec((err, results) => { ... });
});
  

Я немного зациклен на том, как продолжить это, я знаю, что можно отсортировать список, но я не могу понять, как получить только 10 пользователей после определенного смещения.

Я использую клиент Node Redis: https://github.com/NodeRedis/node_redis

Ответ №1:

Для разбиения на страницы с использованием отсортированных наборов ZRANGE , а не ZRANGEBYSCORE . Аргументы — это ранги, поэтому для получения первых 10 пользователей, которых вы используете ZRANGE user:user_by_age 0 9 , для получения следующих 10 пользователей, которых вы используете ZRANGE user:user_by_age 10 19 , и т.д.

Комментарии:

1. Спасибо, я упустил из виду, что, читая документацию, теперь она работает просто отлично.

2. Как вы можете использовать ZRANGE для нумерации страниц, если в отсортированном наборе постоянно добавляются записи?

3. @LukePighetti: Не могли бы вы подробнее рассказать об этом? Вы имеете в виду, что порядок записей может меняться, когда кто-то просматривает серию страниц? Если это так, то это проблема, присущая нумерации страниц, а не что-то конкретное ZRANGE . Если вы хотите избежать этого, вы всегда можете скопировать отсортированное множество и использовать этот снимок для выполнения серии запросов.

4. Я остановился на ZRANGEBYSCORE, используя score в качестве курсора, inf в качестве верхней границы, и у него есть удобное смещение и количество, чтобы упростить разбивку на страницы.

5. @LukePighetti: Хорошо, но я не уверен, какую проблему это решает. Изменения в реальном времени по-прежнему будут приводить к пропускам записей и т. Д., И у вас есть дополнительный недостаток, заключающийся в том, что вы не можете точно отображать рейтинг.