CACHE_ARCHITECTURE.mdβ’29.3 kB
# Redis Cache Architecture Diagram
## System Overview
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β JobNimbus MCP Server β
β with Redis Caching β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββ
β Client β
β (Claude) β
βββββββββ¬ββββββββ
β HTTP Request
β (API key in header)
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Express Server β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Middleware Stack β β
β β - Helmet (security) β β
β β - CORS β β
β β - Rate Limiting β β
β β - cacheHeadersMiddleware (X-Response-Time, X-Cache) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Cache Routes (Monitoring) β β
β β GET /cache/health β healthCheck() β β
β β GET /cache/stats β getStats() β β
β β POST /cache/clear β clear() β β
β β DELETE /cache/invalidate β invalidatePattern() β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β MCP Tools (Business Logic) β β
β β - GetAttachmentsCachedTool β β
β β - GetJobsTool β β
β β - GetContactsTool β β
β β - ... other tools β β
β βββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββ
β
β Uses
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CacheService (Singleton) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Circuit Breaker State Machine β β
β β ββββββββββ 5 failures ββββββββ 60s timeout βββββββββββ β
β β β CLOSED ββββββββββββββββ OPEN ββββββββββββββββ HALF_ ββ β
β β β β β β β OPEN ββ β
β β βββββ¬βββββ ββββββββ βββββ¬ββββββ β
β β β β β β
β β βββββββββββββββββββ3 successesββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Core Methods β β
β β β’ get<T>(entity, operation, identifier): Promise<T|null> β β
β β β’ set<T>(entity, op, id, value, ttl): Promise<boolean> β β
β β β’ delete(entity, operation, identifier): Promise<number> β β
β β β’ invalidatePattern(entity, op): Promise<number> β β
β β β’ clear(): Promise<number> β β
β β β’ getStats(): Promise<CacheMetrics> β β
β β β’ healthCheck(): Promise<HealthStatus> β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Compression Engine β β
β β serialize(value) β JSON β GZIP (if >1KB) β base64 β β
β β deserialize(value) β detect prefix β GUNZIP β JSON β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Metrics Collector β β
β β β’ hits, misses, errors β β
β β β’ avgLatencyMs (rolling window) β β
β β β’ hitRate = hits / totalRequests * 100 β β
β β β’ circuitState (CLOSED/OPEN/HALF_OPEN) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββ
β
β ioredis client
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Redis Server β
β (Render.com free tier: 25MB) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Key Structure (Hierarchical) β β
β β jobnimbus:{entity}:{operation}:{identifier} β β
β β β β
β β Examples: β β
β β β’ jobnimbus:attachments:list:job:123 β β
β β β’ jobnimbus:attachments:detail:file:abc-def β β
β β β’ jobnimbus:jobs:detail:456 β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Eviction Policy: allkeys-lru β β
β β (Least Recently Used when memory full) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Data Format β β
β β β’ Uncompressed: {"id":"123","data":"value"} β β
β β β’ Compressed: gzip:H4sIAAAAAAAAA... β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββ
β
β Fallback on failure
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β JobNimbus API β
β https://app.jobnimbus.com/api1 β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Endpoints: β β
β β β’ GET /files β β
β β β’ GET /jobs β β
β β β’ GET /contacts β β
β β β’ GET /activities β β
β β β’ ... other endpoints β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
## Request Flow with Caching
### Cache Hit Scenario (< 50ms)
```
Client Request
β
βΌ
ββββββββββββββββββ
β Express Server β
ββββββββββ¬ββββββββ
β
βΌ
βββββββββββββββββββββββββ
β GetAttachmentsCached β
β Tool.execute() β
βββββββββ¬ββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β withCache() helper β
βββββββββ¬ββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββ
β CacheService.get() β
β β’ Check circuit breaker: CLOSED β
β β’ Build key: jobnimbus:... β
β β’ Query Redis β
βββββββββ¬ββββββββββββββββββββββββββββ
β
βΌ CACHE HIT
βββββββββββββββββββββββββββββββββββββ
β Redis returns value β
β β’ Decompress if gzip: β
β β’ Deserialize JSON β
β β’ Record metrics: hit++ β
β β’ Record latency: ~3ms β
βββββββββ¬ββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β Return to client β
β Total latency: ~10ms β
βββββββββββββββββββββββββ
```
### Cache Miss Scenario (100-500ms)
```
Client Request
β
βΌ
ββββββββββββββββββ
β Express Server β
ββββββββββ¬ββββββββ
β
βΌ
βββββββββββββββββββββββββ
β GetAttachmentsCached β
β Tool.execute() β
βββββββββ¬ββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β withCache() helper β
βββββββββ¬ββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββ
β CacheService.get() β
β β’ Check circuit breaker: CLOSED β
β β’ Build key: jobnimbus:... β
β β’ Query Redis β
βββββββββ¬ββββββββββββββββββββββββββββ
β
βΌ CACHE MISS (null)
βββββββββββββββββββββββββββββββββββββ
β Execute fetchFn() β
β β’ Call JobNimbus API β
β β’ Process response β
β β’ API latency: ~200ms β
βββββββββ¬ββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββ
β CacheService.set() β
β β’ Serialize to JSON β
β β’ Compress if > 1KB β
β β’ Check size limit (512KB) β
β β’ Store in Redis with TTL β
β β’ Fire-and-forget (async) β
βββββββββ¬ββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β Return to client β
β Total latency: ~250ms β
β (Next call: ~10ms) β
βββββββββββββββββββββββββ
```
### Circuit Breaker Open Scenario
```
Client Request
β
βΌ
ββββββββββββββββββ
β Express Server β
ββββββββββ¬ββββββββ
β
βΌ
βββββββββββββββββββββββββ
β GetAttachmentsCached β
β Tool.execute() β
βββββββββ¬ββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β withCache() helper β
βββββββββ¬ββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββ
β CacheService.get() β
β β’ Check circuit breaker: OPEN β
β β’ Redis unavailable β
β β’ Return null immediately β
βββββββββ¬ββββββββββββββββββββββββββββ
β
βΌ Immediate fallback
βββββββββββββββββββββββββββββββββββββ
β Execute fetchFn() β
β β’ Call JobNimbus API directly β
β β’ Process response β
β β’ API latency: ~200ms β
βββββββββ¬ββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β Return to client β
β Total latency: ~250ms β
β (Degraded but working)β
βββββββββββββββββββββββββ
```
## TTL Strategy
```
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TTL Timeline β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
0min 5min 10min 15min
β β β β
βββββββββββββββββββΌβββββββββββββββββββΌββββββββββββββββββ€
β Search β β β
β Results β β β
β β β β
βββββββββββββββββββΌβββββββββββββββββββΌββββββββββββββββββΌβββββββββ€
β β Job Details β β β
β β β β β
βββββββββββββββββββΌβββββββββββββββββββΌββββββββββββββββββΌβββββββββΌβββββ€
β β β Attachments β β β
β β β List β β β
β β β β β β
βββββββββββββββββββΌβββββββββββββββββββΌββββββββββββββββββΌβββββββββΌβββββΌβββββ€
β β β β Attach β β β
β β β β by Job β β β
β β β β β β β
ββ΄ββββββββββββββββββ΄βββββββββββββββββββ΄ββββββββββββββββββ΄βββββββββ΄βββββ΄βββββ΄ββββ
30min 60min 4hr
Legend:
βββββ€ TTL window
β Cache active
ββ Time axis
```
## Cache Key Hierarchy
```
jobnimbus: (app namespace)
β
βββ attachments:
β βββ list:
β β βββ all
β β βββ job:123
β β βββ job:456
β β βββ contact:789
β βββ detail:
β β βββ file:abc-def
β β βββ file:xyz-123
β βββ search:
β βββ hash:a1b2c3d4
β
βββ jobs:
β βββ list:
β β βββ all
β β βββ status:active
β βββ detail:
β βββ 123
β βββ 456
β
βββ contacts:
β βββ list:
β β βββ all
β βββ detail:
β βββ 789
β βββ 101
β
βββ analytics:
βββ revenue:
β βββ current_month
βββ performance:
βββ sales_rep:all
Invalidation Examples:
β’ invalidatePattern('attachments', 'list')
β Deletes: jobnimbus:attachments:list:*
β’ invalidatePattern('attachments', '*')
β Deletes: jobnimbus:attachments:*:*
β’ invalidatePattern('*', '*job:123*')
β Deletes: All keys containing 'job:123'
```
## Memory Management (25MB Render.com)
```
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Redis Memory Layout β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
0MB 12.5MB 25MB
β β β
βββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββ€
β Active Cache β Buffer Zone β
β (50%) β (50%) β
β β β
β Frequently β Less frequently β
β accessed data β accessed data β
β β β
ββ΄ββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββ΄ββββ
β
β
When >20MB:
Alert + Eviction
(allkeys-lru)
Optimization Strategies:
1. Compression (60-80% reduction)
2. Size limits (512KB β 256KB in prod)
3. LRU eviction policy
4. Short TTLs for volatile data
5. Pattern invalidation (not full flush)
Example Memory Usage:
β’ 1 attachment list (uncompressed): ~50KB
β’ 1 attachment list (compressed): ~15KB
β’ 100 cached lists: ~1.5MB
β’ 500 cached lists: ~7.5MB
β’ Buffer for new entries: ~17.5MB
Total capacity: ~500-1000 cache entries
```
## Monitoring Dashboard Layout
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Cache Monitoring Dashboard β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β Hit Rate β β Avg Latency β β Circuit State β
β ββββββββββββ β β βββββββββββββ β β ββββββββββββ β
β β 84.3% β β β β 4.2ms β β β β CLOSED β β
β ββββββββββββ β β βββββββββββββ β β ββββββββββββ β
β Target: >75% β β Target: <50ms β β Status: OK β
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Request Distribution β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Hits: 8234 βββββββββββββββββββββββββββββ 81.4% β β
β β Misses: 1876 ββββββββββββββββββββββββββββ 18.6% β β
β β Errors: 12 ββββββββββββββββββββββββββββ 0.1% β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β Redis Memory β β Total Keys β β Uptime β
β ββββββββββββ β β ββββββββββββ β β ββββββββββββ β
β β 12.5MB β β β β 1,245 β β β β 3h 24m β β
β ββββββββββββ β β ββββββββββββ β β ββββββββββββ β
β Limit: 25MB β β Capacity: OK β β Since: 10:00 β
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Recent Events β
β 10:30:15 [INFO] Circuit breaker: CLOSED β OPEN β
β 10:31:15 [WARN] Connection retry #3 β
β 10:31:45 [INFO] Circuit breaker: OPEN β HALF_OPEN β
β 10:32:00 [INFO] Circuit breaker: HALF_OPEN β CLOSED β
β 10:45:00 [INFO] Pattern invalidated: attachments:list β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
---
**Architecture by:** Backend Engineering Team
**Version:** 1.0.0
**Last Updated:** 2025-10-13