Files
sac4cps-backend/layers/infrastructure/redis_connection.py
rafaeldpsilva a7a18e6295 first commit
2025-09-09 13:46:42 +01:00

80 lines
2.6 KiB
Python

"""
Redis connection management and operations
Infrastructure Layer - handles Redis connectivity and low-level operations
"""
import os
import json
from typing import Optional, Dict, Any
import logging
import redis.asyncio as redis
logger = logging.getLogger(__name__)
class RedisConnection:
"""Manages Redis connection and basic operations"""
def __init__(self):
self.redis_client: Optional[redis.Redis] = None
self._host = os.getenv("REDIS_HOST", "localhost")
self._port = int(os.getenv("REDIS_PORT", "6379"))
self._db = int(os.getenv("REDIS_DB", "0"))
async def connect(self) -> None:
"""Connect to Redis"""
try:
self.redis_client = redis.Redis(
host=self._host,
port=self._port,
db=self._db,
decode_responses=True
)
await self.redis_client.ping()
logger.info("Successfully connected to Redis")
except Exception as e:
logger.error(f"Error connecting to Redis: {e}")
raise
async def disconnect(self) -> None:
"""Disconnect from Redis"""
if self.redis_client:
await self.redis_client.close()
logger.info("Disconnected from Redis")
async def get_client(self) -> redis.Redis:
"""Get Redis client instance"""
if not self.redis_client:
await self.connect()
return self.redis_client
async def set_with_expiry(self, key: str, value: str, expire_seconds: int = 3600) -> None:
"""Set a key-value pair with expiration"""
client = await self.get_client()
await client.setex(key, expire_seconds, value)
async def get(self, key: str) -> Optional[str]:
"""Get value by key"""
client = await self.get_client()
return await client.get(key)
async def delete(self, key: str) -> None:
"""Delete a key"""
client = await self.get_client()
await client.delete(key)
async def get_keys_by_pattern(self, pattern: str) -> list:
"""Get keys matching a pattern"""
client = await self.get_client()
return await client.keys(pattern)
async def publish(self, channel: str, message: str) -> None:
"""Publish message to a channel"""
client = await self.get_client()
await client.publish(channel, message)
async def create_pubsub(self) -> redis.client.PubSub:
"""Create a pub/sub instance"""
client = await self.get_client()
return client.pubsub()
# Global Redis connection instance
redis_connection = RedisConnection()