Безопасный способ сохранения частичной копии хеш-набора в отсортированном наборе

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

У меня следующая структура данных

=> title

=> content

=> date

=> score

=> id

И нужно хранить только title и date в отсортированном наборе, что я делаю при создании каждого основного сообщения.

Проблема заключается в том, что мне нужно удалить этот контент и в отсортированном наборе, потому что, если я это сделаю

zadd 10 [title, date], где 10 - это score, если я захочу удалить его, если будет другой пост с score 10, оба будут удалены, что не является той функциональностью, которую я хочу, и, очевидно, так.

Я думал о добавлении поста id к счету, например, 6+10 => 610, но это испортит порядок наборов и создаст огромный беспорядок. Добавление его еще более обременительно, необслуживаемое, если не сказать очень неэффективное.

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

Как решить эту проблему (безопасное удаление с сохранением копии частичного хеш-набора в отсортированном наборе)?


person Adam Barak    schedule 26.08.2014    source источник


Ответы (1)


Вы можете использовать lua-скрипт. Поскольку redis является однопоточным, при выполнении lua другие запросы не выполняются одновременно (пессимистическая блокировка).

В вашем lua-скрипте (команда EVAL) вы сохраняете элементы со счетом, который хотите добавить (10 в вашем примере с ZRANGEBYSCORE). Удалите все элементы с этим счетом из Redis с помощью ZREMRANGEBYSCORE. Добавьте обратно сохраненные элементы в lua с помощью ZADD в redis.

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

person zenbeni    schedule 26.08.2014