Классическая задача на system design. Берёшь длинный URL, генерируешь короткий ключ (base62 от auto-increment ID или случайная строка 6-8 символов), сохраняешь маппинг в БД. При редиректе — GET по короткому ключу, ищешь в кэше (Redis), если нет — идёшь в БД, возвращаешь 301/302. Для масштабирования шардируешь по ключу, ставишь кэш перед БД. Если нужна аналитика — логируешь каждый клик асинхронно через очередь.