#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;