#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: Хорошо, но я не уверен, какую проблему это решает. Изменения в реальном времени по-прежнему будут приводить к пропускам записей и т. Д., И у вас есть дополнительный недостаток, заключающийся в том, что вы не можете точно отображать рейтинг.