File size: 2,727 Bytes
fe4792e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51b64bb
 
fe4792e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import redis
import json
import logging
from typing import Any, Optional
from datetime import timedelta
import os
from dotenv import load_dotenv
from utils.logging_utils import log_to_file

load_dotenv()

class CacheManager:
    def __init__(self):
        """Initialise la connexion Redis"""
        self.redis_client = redis.Redis(
            host=os.getenv("REDIS_HOST"),
            port=int(os.getenv("REDIS_PORT")),
            username=os.getenv("REDIS_USERNAME"),  # Ajout du nom d'utilisateur pour l'instance render
            password=os.getenv("REDIS_PASSWORD"),  # Ajout du mot de passe pour l'instance render
            decode_responses=True  # Pour automatiquement décoder les réponses en str
        )
        self.default_expiry = timedelta(hours=1)  # Expiration par défaut : 1 heure

    async def get(self, key: str) -> Optional[Any]:
        """Récupère une valeur du cache"""
        try:
            value = self.redis_client.get(key)
            if value:
                log_to_file(f"Cache hit pour la clé: {key}", level=logging.INFO)
                return json.loads(value)
            log_to_file(f"Cache miss pour la clé: {key}", level=logging.INFO)
            return None
        except Exception as e:
            log_to_file(f"Erreur lors de la lecture du cache: {str(e)}", level=logging.ERROR)
            return None

    async def set(self, key: str, value: Any, expiry: Optional[timedelta] = None) -> bool:
        """Enregistre une valeur dans le cache"""
        try:
            expiry_seconds = int((expiry or self.default_expiry).total_seconds())
            success = self.redis_client.setex(
                key,
                expiry_seconds,
                json.dumps(value)
            )
            if success:
                log_to_file(f"Valeur mise en cache pour la clé: {key}", level=logging.INFO)
            return success
        except Exception as e:
            log_to_file(f"Erreur lors de l'écriture dans le cache: {str(e)}", level=logging.ERROR)
            return False

    async def delete(self, key: str) -> bool:
        """Supprime une valeur du cache"""
        try:
            return bool(self.redis_client.delete(key))
        except Exception as e:
            log_to_file(f"Erreur lors de la suppression du cache: {str(e)}", level=logging.ERROR)
            return False

    async def clear_all(self) -> bool:
        """Vide tout le cache"""
        try:
            self.redis_client.flushall()
            log_to_file("Cache entièrement vidé", level=logging.INFO)
            return True
        except Exception as e:
            log_to_file(f"Erreur lors du vidage du cache: {str(e)}", level=logging.ERROR)
            return False