examples/performance/cache_redis_example.py
#!/usr/bin/env python3
"""
Exemple d'utilisation du cache Redis avec Catnip.

Permet de partager le cache entre plusieurs processus/machines.
Nécessite Redis et le package 'redis' Python.
"""
from catnip import Catnip
from catnip.cache import CatnipCache, RedisCache


def main():
    print("⇒ Cache Redis (Multi-processus)")

    try:
        # Créer un backend Redis avec TTL de 1 heure
        redis_backend = RedisCache(
            redis_client=None, ttl=3600, prefix="catnip_demo"  # Connexion par défaut localhost:6379  # 1 heure
        )

        # Créer le cache avec contrôle fin
        cache = CatnipCache(backend=redis_backend, cache_ast=True, cache_bytecode=True)  # Cache aussi le bytecode

        print("1. Connexion à Redis réussie")
        print(f"   Config: {redis_backend.stats()['redis_info']}\n")

        # Nettoyer le cache précédent
        cache.clear()

        # Premier parsing
        print("2. Premier parsing avec mise en cache")
        code = """
        fib = (n) => {
            if n <= 1 {
                n
            } else {
                fib(n - 1) + fib(n - 2)
            }
        }
        fib(10)
        """

        catnip = Catnip(cache=cache)
        catnip.parse(code)
        result = catnip.execute()
        print(f"   fib(10) = {result}")
        print(f"   Stats: {cache.stats()}\n")

        # Deuxième parsing depuis un autre "processus" simulé
        print("3. Parsing depuis cache (autre instance)")
        catnip2 = Catnip(cache=cache)
        catnip2.parse(code)
        result2 = catnip2.execute()
        print(f"   fib(10) = {result2}")
        print(f"   Stats: {cache.stats()}\n")

        # Tester le contrôle fin : même code, options différentes
        print("4. Même code avec optimize=False (clé différente)")
        catnip3 = Catnip(cache=cache)
        catnip3.pragma_context.optimize_level = 0
        catnip3.parse(code)
        print(f"   Stats: {cache.stats()}\n")

        # Afficher les statistiques finales
        print("5. Statistiques finales Redis")
        stats = cache.stats()
        for key, value in stats.items():
            print(f"   {key}: {value}")

    except ImportError:
        print("❌ Le package 'redis' n'est pas installé")
        print("   Installe-le avec: pip install redis")
    except Exception as e:
        print(f"❌ Erreur de connexion Redis: {e}")
        print("   Assure-toi que Redis tourne sur localhost:6379")


if __name__ == "__main__":
    main()