В Redis v5 и выше это должно "просто работать" из-за перехода к репликации эффектов скрипта по умолчанию.
В v4 вам нужно будет выполнить redis.replicate_commands()
перед любой случайной командой в скрипте.
РЕДАКТИРОВАТЬ: за ваши правки и комментарии, вот пример:
-- uncomment the next line for Redis v4
-- redis.replicate_commands()
local source = KEYS[1]
local target = KEYS[2]
local num = ARGV[1]
local elems = redis.call("SPOP", source, num)
if #elems > 0 then
redis.call("SADD", target, unpack(elems))
end
return redis.status_reply("OK")