Вы правильно рассматриваете использование uuid в комбинации с редисом для ограничения количества попыток отправки запросов активации.
Каждый раз, когда пользователь запрашивает отправку письма активации, генерируйте новый uuid и сохраняйте его вместе с адресом электронной почты или айдишником пользователя в редис. Задайте время жизни (TTL) для этих ключей, чтобы они автоматически удалялись через определенное время (например, через 24 часа).
При каждой новой попытке отправки письма активации, проверяйте, существует ли уже ключ с данным uuid в редисе. Если ключ существует, значит, уже была отправлена попытка. В этом случае, вы можете либо отказать в отправке нового письма, либо сообщить пользователю о необходимости дождаться некоторого времени перед следующей попыткой.
Использование редиса прекрасно подходит для таких временных ограничений, так как он работает быстро и может автоматически удалять ключи после истечения их срока годности.
Если вы не хотите использовать базу данных, другим вариантом может быть использование внутреннего кэша памяти в вашем приложении. Однако стоит учесть, что такой подход может потреблять больше ресурсов памяти и не будет работать в случае перезапуска приложения.