Сбросить баллы Redis, отсортированных после zremrangebyscore

#javascript #node.js #redis #software-distribution

#язык JavaScript #node.js #редис #распространение программного обеспечения

Вопрос:

Я использую набор сортировки Redis, чтобы сохранить некоторые значения в порядке. например:

 score | data 0 | a 1 | b 2 | c 3 | d  

В некоторых ситуациях в моем приложении мне приходится удалять некоторые записи. например, я удаляю оценки 1 и 2 участника:

 score | data 0 | a 3 | d  

Я хочу изменить вышесказанное на:

 score | data 0 | a 1 | d  

Как я могу это сделать?

пожалуйста, помогите, заранее спасибо.

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

1. Ваш счет всегда начинается с 0, и оценка каждого нового элемента всегда равна размеру набора? Другими словами, всегда ли ваши результаты соответствуют следующей схеме: 0, 1, 2, 3, 4,…?

2. @for_stack да, это точно 0,1,2,3,….

Ответ №1:

Я думаю, что в Redis невозможно использовать отсортированный список, как индексированный массив.

Если вы хотите иметь отсортированный список с последовательным счетом, вам следует позаботиться об этом самостоятельно, чтобы после каждого удаления вы могли перезаписывать свой отсортированный список новыми баллами.

Ответ №2:

Похоже, что вам не нужен балл, вместо этого вам нужен ранг.

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

 127.0.0.1:6379gt; incr counter (integer) 1 127.0.0.1:6379gt; zadd set 1 a (integer) 1 127.0.0.1:6379gt; incr counter (integer) 2 127.0.0.1:6379gt; zadd set 2 b (integer) 1 127.0.0.1:6379gt; incr counter (integer) 3 127.0.0.1:6379gt; zadd set 3 c (integer) 1 127.0.0.1:6379gt; incr counter (integer) 4 127.0.0.1:6379gt; zadd set 4 d  

Вы можете использовать ZREMRANGEBYRANK для удаления элементов и ZRANK получения ранга каждого элемента (ранг всегда начинается с 0).

 127.0.0.1:6379gt; zremrangebyrank set 1 2 (integer) 2 lt;------- remove b and c 127.0.0.1:6379gt; zrank set a (integer) 0 127.0.0.1:6379gt; zrank set d (integer) 1  

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

1. Спасибо за ваш совет, но это не может решить мою проблему. Мое приложение получает некоторые данные с сервера, на котором есть индексы, и порядок этих данных важен. С другой стороны, иногда один из них может быть удален, один может быть изменен, а иногда некоторые данные могут быть удалены, и индексы должны быть сброшены.

Ответ №3:

После долгих поисков и напряженной работы я нашел решение.

Вы можете использовать сценарий Lua и команду EVAL:

 EVAL  " redis.call('ZREMRANGEBYSCORE', KEYS[1], KEYS[2], KEYS[2]); local otherMembers = redis.call('ZRANGEBYSCORE', KEYS[1], KEYS[2], 1/0); for k, v in ipairs(otherMembers) do redis.call('ZINCRBY', KEYS[1], -1], v); " 2 key index;