Как сохранить первые 10 участников и удалить остальную часть отсортированного набора Redis?

Я хочу сохранить результат моих последних 10 запросов в отсортированном наборе Redis. Я использую временные метки в качестве оценки. Мне нужно сохранить 10 лучших участников по количеству очков и удалить остальных. Мне в основном нужны ZREMRANGEBYREVSCORE или ZREMRANGEBYREVRANK, но этих команд не существует. Есть ли способ обойти это?


person roser137    schedule 10.09.2018    source источник


Ответы (2)


Команда Redis ZPOPMIN выводит минимальное значение или указанное количество минимальных значений из отсортированного набора. Однако он поддерживается только с версии 5.0.0, которая не является стабильной.

person Gunasekar    schedule 10.09.2018
comment
Мне нужно сохранить топ-10 участников и удалить всех остальных. ZPOPMIN удаляет количество участников, указанное командой. Я не знаю, сколько я должен удалить в этом сценарии. - person roser137; 10.09.2018
comment
@ roser137 Можете ли вы использовать ZCARD, чтобы получить мощность отсортированного набора и удалить элементы. - person Gunasekar; 11.09.2018
comment
Вы можете использовать ZCARD, чтобы получить общее количество элементов в наборе, а total number - 10 — это COUNT, которые вам нужны для ZPOPMIN. - person for_stack; 11.09.2018
comment
Это включает в себя два шага. Должен ли я использовать конвейеры, чтобы использовать этот метод без потери данных? - person roser137; 12.09.2018

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

counter = 0;
// temp data
setInterval(async () => {
    counter += 1;
    val = (new Date()).toString() + " " + counter;
    score = -1 * (new Date() / 1000);
    res = await client.zaddAsync("myset", score, val)
}, 1000)

// remove other than top50
setInterval(async () => {
    res = await client.zremrangebyrankAsync("myset", 50, -1);
    console.log("myset zremrangebyrank" + " " + res + " " + val);    
}, 5000)

// log
setInterval(async () => {
    res = await client.zrangeAsync("myset", 0, 5);
    console.log(res);

    res = await client.zcardAsync("myset");
    console.log("myset zcard" + " " + res);      
}, 2000)
person roser137    schedule 10.09.2018