This document outlines the storage strategy for Fantasy Premier League (FPL) manager picks data, which is critical for features like the "Worst Captain Picks" analysis.
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ FPL API โ โ KV Cache โ
โ (Source) โโโโโบโ (Fast Access) โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
- Endpoint:
https://fantasy.premierleague.com/api/entry/{entryId}/event/{gameweek}/picks/ - Purpose: Real-time data when cache misses
- Rate Limits: Yes, requires careful management
- Data Format: Raw picks data
- Purpose: Fast access and long-term storage of picks data
- Cache Duration: 7 days (since picks don't change after deadline)
- Key Pattern:
fc-footy:manager-picks:{entryId}:{gameweek} - Metadata Key:
fc-footy:manager-picks:metadata:{entryId}:{gameweek} - Gameweeks List:
fc-footy:manager-gameweeks:{entryId}
- Enriched Picks Data: Complete player and team information
- Metadata: Cache health, pick counts, captain status
- Gameweek Tracking: Available gameweeks per manager
- Bulk Operations: Efficient batch processing
-
Extended Cache Duration
- Before: 1 hour cache
- After: 7 days cache (since picks are immutable after deadline)
-
Metadata Tracking
- Store metadata separately for faster queries
- Track last updated, pick counts, captain/vice captain status
-
Bulk Operations
- Bulk store/retrieve for multiple managers
- Batch processing to avoid API rate limits
-
Gameweek Tracking
- Track available gameweeks per manager
- Faster discovery of available data
fc-footy:manager-picks:{entryId}:{gameweek} # Main picks data (7 days)
fc-footy:manager-picks:metadata:{entryId}:{gameweek} # Metadata (1 day)
fc-footy:manager-gameweeks:{entryId} # Available gameweeks (30 days)
Request โ Check KV Cache โ If miss โ Fetch from FPL API โ Enrich โ Store in KV โ Return
- โ 1-hour cache = frequent API calls
- โ No bulk operations
- โ No metadata tracking
- โ Inefficient for historical data
- โ Supabase dependency for persistence
- โ 7-day cache = 168x fewer API calls
- โ Bulk operations for efficiency
- โ Metadata for fast queries
- โ Gameweek tracking for discovery
- โ Better error handling and fallbacks
- โ Simplified architecture (KV-only)
- โ No external database dependencies
- File:
src/lib/kvPicksStorage.ts - Functions:
storeManagerPicks()- Store with extended cachegetManagerPicks()- Retrieve from cachebulkStoreManagerPicks()- Bulk operationsgetManagerGameweeks()- Available gameweeksgetPicksCacheStats()- Cache statistics
- File:
src/app/api/manager-picks/route.ts - Improvements:
- Uses new KV storage utility
- Extended cache duration
- Better error handling
- Source tracking
- File:
scripts/populate-picks-cache.mjs - Purpose: Pre-populate cache for all managers
- Features:
- Batch processing
- Rate limiting
- Error handling
- Progress tracking
import { getManagerPicks } from '~/lib/kvPicksStorage';
const picks = await getManagerPicks(entryId, gameweek);
if (picks) {
const captain = picks.picks.find(p => p.is_captain);
const viceCaptain = picks.picks.find(p => p.is_vice_captain);
// Analyze captain vs vice captain performance
}import { bulkGetManagerPicks } from '~/lib/kvPicksStorage';
const requests = [
{ entryId: 123, gameweek: 1 },
{ entryId: 456, gameweek: 1 },
{ entryId: 789, gameweek: 1 }
];
const results = await bulkGetManagerPicks(requests);
// Process all results efficientlyimport { getPicksCacheStats, getCacheHealthSummary } from '~/lib/kvPicksStorage';
const stats = await getPicksCacheStats();
console.log(`Total cached picks: ${stats.totalKeys}`);
const health = await getCacheHealthSummary();
console.log(`Cache status: ${health.status} - ${health.message}`);# Populate cache for all managers, gameweek 1
node scripts/populate-picks-cache.mjs# Monitor cache health and statistics
node scripts/monitor-picks-cache.mjs- Cache is populated on first request
- Bulk population script for pre-loading
- Future: Scheduled population for new gameweeks
- Deadline Lock: Picks are locked at gameweek deadline
- No Transfers: In-game transfers don't affect picks
- Historical Record: Picks represent historical decisions
- 7-day cache: Safe since data is immutable
- No refresh needed: Once cached, data is valid
- Efficient storage: Store once, read many times
- Compare captain vs vice captain performance
- Rank managers by missed points
- Generate banter content for social media
- Track captain choices over time
- Analyze manager decision patterns
- Generate insights and statistics
- Fast access to current picks
- Live updates during gameweek
- Quick comparisons and rankings
- Extended Cache Analytics: Enhanced cache statistics and monitoring
- Scheduled Population: Auto-populate cache for new gameweeks
- Advanced Queries: Complex picks analysis queries
- Cache Optimization: Further optimize cache keys and data structure
- Captain choice trends
- Manager performance analytics
- Historical comparisons
- Predictive analytics
- Monitor cache hit rates
- Track API call frequency
- Alert on cache failures
- Verify picks data integrity
- Cross-reference with FPL API
- Handle data inconsistencies
- Response times
- Cache efficiency
- API usage patterns
This storage strategy ensures efficient, reliable access to FPL picks data while minimizing API calls and maximizing performance.