Скрипт Redis LUA удалить распаковать по слайсу

локальные ключи = redis.call('keys', KEYS[1])

для i=1,#keys,5000 do redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) end


имея приведенный выше код, почему мы обычно используем 5000 count для цикла удаления redis?


person Simon Haykal    schedule 06.05.2021    source источник
comment
откуда это число? это просто размер партии. Я нашел много других размеров пакетов в быстром веб-поиске, так почему вы думаете, что обычно это 5000?   -  person Piglet    schedule 06.05.2021


Ответы (1)


почему мы обычно используем 5000 счетчиков для цикла удаления Redis?

Я не знаю. Как упоминалось в моем комментарии, есть много других примеров кода с разными размерами пакетов.

В некоторых реализациях Lua количество значений, которые может обрабатывать table.unpack, ограничено несколькими тысячами.

Просто проверьте, какие размеры пакетов лучше всего подходят для вас. Небольшой размер пакета означает больше вызовов API Redis. Большой размер пакета означает более длительное время ожидания на стороне Lua.

В руководстве по Redis не указано максимальное количество.

https://redis.io/commands/del

В руководстве по Lua сказано:

Существует зависящий от системы предел количества значений, которые может возвращать функция. Этот предел гарантированно превышает 1000.

Редактировать

поэтому, если мы хотим подробно объяснить приведенный выше код: 5000 — это размер пакета, как насчет #keys, ключевого слова unpack и использования функции math.min ??. может кто-нибудь помочь

local keys = redis.call('keys', KEYS[1])

for i=1,#keys,5000 do redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) end

Этот код получает ключи от Redis и сохраняет их в таблице keys.

#keys — это количество элементов в keys. 5000 - приращение. Таким образом, каждая итерация цикла i увеличивается на 5000. math.min(i + 4999) вычисляет конечный ключ для команды del. Это приводит к меньшему из обоих значений, поэтому вы не используете число больше, чем количество элементов.

Допустим, у вас есть 6000 ключей. Вы удалите ключи 1-5000 при первом запуске, потому что i+4999 равно 5000. Это меньшее значение 5000 и 6000. Во втором прогоне i равно 5001, поэтому 6000 является меньшим значением 10000 и 6000. Так вы удалите ключи 5001-6000. Согласитесь, не имеет смысла удалять 5001-10000, если в этом списке всего 6000 значений.

person Piglet    schedule 06.05.2021
comment
сделка спасибо . . поэтому, если мы хотим подробно объяснить приведенный выше код: 5000 — это размер пакета, как насчет #keys, ключевого слова unpack и использования функции math.min ??. может кто-нибудь помочь - person Simon Haykal; 06.05.2021
comment
@SimonHaykal см. редактирование. пожалуйста, прочитайте руководство по Lua. это очень простой синтаксис.... - person Piglet; 06.05.2021
comment
обычно они рекомендуют использовать сканирование, а затем отвязать для удаления. как лучше всего и быстро выполнить запрос в LUA удалить данные в Redis - person Simon Haykal; 18.05.2021