initial project setup with README and ignore
This commit is contained in:
79
app/routes/cache.py
Normal file
79
app/routes/cache.py
Normal file
@@ -0,0 +1,79 @@
|
||||
"""Cache management API endpoints."""
|
||||
|
||||
import logging
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from typing import Dict, Any
|
||||
|
||||
from app.services import cache
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
router = APIRouter(prefix="/api/v1/cache", tags=["Cache Management"])
|
||||
|
||||
|
||||
@router.get("/stats", response_model=Dict[str, Any])
|
||||
async def get_cache_stats():
|
||||
"""
|
||||
Get cache statistics.
|
||||
|
||||
Returns:
|
||||
- hits: Number of cache hits
|
||||
- misses: Number of cache misses
|
||||
- sets: Number of cache writes
|
||||
- total_keys: Current number of cached route keys
|
||||
- enabled: Whether Redis cache is enabled
|
||||
"""
|
||||
try:
|
||||
stats = cache.get_stats()
|
||||
# Calculate hit rate
|
||||
total_requests = stats.get("hits", 0) + stats.get("misses", 0)
|
||||
if total_requests > 0:
|
||||
stats["hit_rate"] = round(stats.get("hits", 0) / total_requests * 100, 2)
|
||||
else:
|
||||
stats["hit_rate"] = 0.0
|
||||
return stats
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting cache stats: {e}")
|
||||
raise HTTPException(status_code=500, detail="Internal server error")
|
||||
|
||||
|
||||
@router.get("/keys")
|
||||
async def list_cache_keys(pattern: str = "routes:*"):
|
||||
"""
|
||||
List cache keys matching pattern.
|
||||
|
||||
- **pattern**: Redis key pattern (default: "routes:*")
|
||||
"""
|
||||
try:
|
||||
keys = cache.get_keys(pattern)
|
||||
return {
|
||||
"pattern": pattern,
|
||||
"count": len(keys),
|
||||
"keys": keys[:100] # Limit to first 100 for response size
|
||||
}
|
||||
except Exception as e:
|
||||
logger.error(f"Error listing cache keys: {e}")
|
||||
raise HTTPException(status_code=500, detail="Internal server error")
|
||||
|
||||
|
||||
@router.delete("/clear")
|
||||
async def clear_cache(pattern: str = "routes:*"):
|
||||
"""
|
||||
Clear cache keys matching pattern.
|
||||
|
||||
- **pattern**: Redis key pattern to delete (default: "routes:*")
|
||||
|
||||
[WARN] **Warning**: This will delete cached route optimizations!
|
||||
"""
|
||||
try:
|
||||
deleted_count = cache.delete(pattern)
|
||||
logger.info(f"Cleared {deleted_count} cache keys matching pattern: {pattern}")
|
||||
return {
|
||||
"pattern": pattern,
|
||||
"deleted_count": deleted_count,
|
||||
"message": f"Cleared {deleted_count} cache keys"
|
||||
}
|
||||
except Exception as e:
|
||||
logger.error(f"Error clearing cache: {e}")
|
||||
raise HTTPException(status_code=500, detail="Internal server error")
|
||||
|
||||
Reference in New Issue
Block a user