Skip to content

Latest commit

 

History

History
260 lines (206 loc) · 7.38 KB

File metadata and controls

260 lines (206 loc) · 7.38 KB

Redis Standardization Documentation

Overview

AutoBot has implemented a centralized Redis client system to standardize Redis access across all components. This ensures consistent connection management, error handling, and configuration.

Centralized Redis Client

Location

  • Primary Module: src/utils/redis_client.py
  • Database Manager: src/utils/redis_database_manager.py

Usage Pattern

# Import centralized Redis client
from src.utils.redis_client import get_redis_client

async def your_function():
    # Get Redis client for specific database
    redis_client = await get_redis_client('main')
    if redis_client:
        await redis_client.set("key", "value")
        value = await redis_client.get("key")
    else:
        # Handle Redis unavailable scenario
        logger.warning("Redis not available, using fallback")

Migrated Components

✅ Completed Migrations

  1. scripts/utilities/npu_worker.py

    • Before: Direct redis.Redis() connection
    • After: Uses get_redis_client('main')
    • Benefits: Centralized connection management, automatic fallback
  2. scripts/monitoring_system.py

    • Before: Manual Redis import and connection
    • After: Centralized Redis client integration
    • Benefits: Consistent error handling, configuration management
  3. scripts/phase_validation_system.py

    • Before: Blocking Redis operations with manual connection
    • After: Async Redis operations with centralized client
    • Benefits: Non-blocking health checks, proper async handling
  4. scripts/startup_coordinator.py

    • Before: Synchronous Redis ping for health checks
    • After: Async Redis health checks with proper error handling
    • Benefits: Better startup sequence management
  5. scripts/utilities/test_autobot_functionality.py

    • Before: Manual Redis connection with hardcoded parameters
    • After: Centralized client with standardized test operations
    • Benefits: Consistent testing across environments

Configuration Management

Database Separation

The system supports multiple Redis databases:

# Available database configurations
databases = {
    'main': 0,           # Primary application data
    'cache': 1,          # Caching layer
    'sessions': 2,       # User sessions
    'tasks': 3,          # Background tasks
    'metrics': 4,        # Performance metrics
    'logs': 5,           # Application logs
    'knowledge': 6,      # Knowledge base data
    'vectors': 7,        # Vector embeddings
    'analytics': 8,      # Analytics data
    'temp': 9           # Temporary data
}

Environment-Specific Configuration

The system automatically adapts to different deployment environments:

  • WSL + Docker Desktop: Uses localhost with Docker port mapping
  • Linux Native: Direct Docker IP access (192.168.65.x)
  • Distributed: Custom Redis endpoints per environment

Error Handling

Graceful Fallback

All components implement graceful fallback when Redis is unavailable:

try:
    redis_client = await get_redis_client('main')
    if redis_client:
        # Use Redis operations
        pass
    else:
        # Fallback to file-based storage or in-memory caching
        logger.warning("Redis unavailable, using fallback storage")
except Exception as e:
    logger.error(f"Redis error: {e}")
    # Continue with degraded functionality

Connection Resilience

  • Automatic connection retry logic
  • Health check integration
  • Timeout handling
  • Connection pooling

Best Practices

1. Always Use Async Operations

# Correct - Async operations
redis_client = await get_redis_client('main')
await redis_client.set("key", "value")

# Incorrect - Blocking operations
redis_client = redis.Redis()  # Don't do this
redis_client.set("key", "value")

2. Handle Redis Unavailability

redis_client = await get_redis_client('main')
if redis_client:
    # Redis available
    await redis_client.lpush("queue", data)
else:
    # Fallback mechanism
    store_in_file(data)

3. Use Appropriate Database

# Use specific databases for different purposes
cache_client = await get_redis_client('cache')      # For caching
session_client = await get_redis_client('sessions') # For sessions
metrics_client = await get_redis_client('metrics')  # For metrics

4. Proper Error Handling

try:
    redis_client = await get_redis_client('main')
    if redis_client:
        result = await redis_client.get("key")
        return result
except Exception as e:
    logger.error(f"Redis operation failed: {e}")
    return None  # Or appropriate fallback

Testing

Redis Health Checks

All components now use standardized Redis health checks:

async def check_redis_health():
    try:
        redis_client = await get_redis_client('main')
        if redis_client:
            await redis_client.ping()
            return True
        return False
    except Exception:
        return False

Testing Components

The test suite validates:

  • Redis connectivity across all databases
  • Fallback behavior when Redis is unavailable
  • Performance under load
  • Error recovery scenarios

Migration Benefits

1. Consistency

  • Uniform Redis access pattern across all components
  • Standardized error handling
  • Consistent configuration management

2. Reliability

  • Automatic connection management
  • Graceful degradation when Redis unavailable
  • Connection pooling and timeout handling

3. Maintainability

  • Single point of configuration
  • Easier debugging and monitoring
  • Simplified testing procedures

4. Performance

  • Connection pooling reduces overhead
  • Async operations prevent blocking
  • Efficient resource utilization

Future Enhancements

Planned Improvements

  1. Redis Cluster Support: For high-availability deployments
  2. Metrics Collection: Detailed Redis performance metrics
  3. Connection Monitoring: Real-time connection health
  4. Automatic Failover: Multiple Redis endpoints support

Configuration Expansion

  1. SSL/TLS Support: Secure Redis connections
  2. Authentication: Redis AUTH integration
  3. Compression: Data compression for large payloads
  4. Sharding: Automatic data distribution

Troubleshooting

Common Issues

  1. Redis Connection Refused

    • Check Redis service status
    • Verify network connectivity
    • Confirm Redis configuration
  2. Slow Redis Operations

    • Monitor Redis memory usage
    • Check network latency
    • Review key expiration policies
  3. Database Selection Errors

    • Verify database exists in configuration
    • Check Redis maxdatabases setting
    • Validate database permissions

Debug Commands

# Check Redis status
docker ps | grep redis

# Test Redis connectivity
redis-cli ping

# Monitor Redis operations
redis-cli monitor

# Check Redis configuration
redis-cli CONFIG GET databases

Summary

The Redis standardization migration has successfully:

  • ✅ Migrated 5 critical components to centralized Redis client
  • ✅ Implemented consistent error handling across all components
  • ✅ Established graceful fallback mechanisms
  • ✅ Standardized async operations for better performance
  • ✅ Created comprehensive documentation and best practices

This standardization improves AutoBot's reliability, maintainability, and performance while providing a solid foundation for future Redis-based features.