brainy/docs/guides/cache-configuration.md
David Snelling 69f8b999ea **feat(docs): add comprehensive cache configuration guide and enhance adaptive tuning**
- Added `cache-configuration.md` under `docs/guides`:
  - Detailed multi-level cache system (hot, warm, cold) overview.
  - Explained new adaptive tuning capabilities:
    - Memory-based adjustments across Node.js, Browser, and Worker environments.
    - Dynamic sizing for read-heavy/write-heavy workloads.
    - Environment-specific configurations for optimal caching.
  - Included best practices for large datasets, memory-constrained and read-only environments.
  - Added monitoring and advanced manual tuning instructions.
- Modified `cacheManager.ts`:
  - Introduced `environmentConfig` for tailored per-environment cache settings.
  - Enhanced auto-tuning with support for dynamic memory detection and cache hit/miss ratio.
  - Added fine-grained tuning for eviction thresholds, TTLs, and batch sizes based on workload characteristics.
  - Improved adaptive tuning with async memory detection and detailed cache statistics tracking.

**Purpose**: Provide developers with detailed guidance and dynamic tools for optimizing Brainy's cache system, ensuring better performance across diverse environments and workloads.
2025-08-01 11:47:34 -07:00

6 KiB

Brainy Cache Configuration Guide

This guide explains how to configure and optimize Brainy's cache system for different environments and use cases.

Cache System Overview

Brainy uses a multi-level cache system to optimize performance:

  1. Hot Cache: In-memory cache for frequently accessed items
  2. Warm Cache: Secondary cache with longer retention but slower access
  3. Cold Storage: Persistent storage for all data

New Features

Dynamic Memory Detection

Brainy now includes a sophisticated memory detection mechanism that works across all JavaScript environments:

  • Node.js: Uses dynamic import of the os module to get actual system memory
  • Browser: Uses performance.memory or navigator.deviceMemory APIs
  • Worker: Uses available memory APIs or conservative defaults
// The cache will automatically detect available memory
const brainy = new BrainyData();

Environment-Specific Configuration

You can now specify different cache configurations for each environment:

const brainy = new BrainyData({
  cacheOptions: {
    environmentConfig: {
      // Node.js specific settings
      node: {
        hotCacheMaxSize: 10000,
        hotCacheEvictionThreshold: 0.85,
        warmCacheTTL: 48 * 60 * 60 * 1000, // 48 hours
        batchSize: 50
      },
      // Browser specific settings
      browser: {
        hotCacheMaxSize: 5000,
        hotCacheEvictionThreshold: 0.8,
        warmCacheTTL: 24 * 60 * 60 * 1000, // 24 hours
        batchSize: 20
      },
      // Worker specific settings
      worker: {
        hotCacheMaxSize: 3000,
        hotCacheEvictionThreshold: 0.75,
        warmCacheTTL: 12 * 60 * 60 * 1000, // 12 hours
        batchSize: 15
      }
    }
  }
});

Adaptive Cache Tuning

The cache system now includes improved adaptive tuning that automatically adjusts based on:

  1. Available memory in the current environment
  2. Cache hit/miss ratios
  3. Access patterns (read-heavy vs. write-heavy)
  4. Dataset size and characteristics
  5. Storage type (S3, filesystem, memory)

The adaptive tuning system will:

  • Increase cache sizes for read-only workloads
  • Optimize batch sizes based on network conditions
  • Adjust eviction thresholds based on memory pressure
  • Tune warm cache TTL based on update frequency
// Enable auto-tuning (on by default)
const brainy = new BrainyData({
  cacheOptions: {
    autoTune: true
  }
});

// Disable auto-tuning if needed
const brainy = new BrainyData({
  cacheOptions: {
    autoTune: false
  }
});

Best Practices

For Large Datasets

When working with large datasets (>100K items):

const brainy = new BrainyData({
  cacheOptions: {
    // For Node.js environments with large datasets
    environmentConfig: {
      node: {
        hotCacheMaxSize: 50000,
        batchSize: 100
      }
    }
  }
});

For Memory-Constrained Environments

For environments with limited memory:

const brainy = new BrainyData({
  cacheOptions: {
    // Conservative settings for memory-constrained environments
    hotCacheMaxSize: 1000,
    hotCacheEvictionThreshold: 0.7, // Evict earlier
    warmCacheTTL: 6 * 60 * 60 * 1000, // 6 hours
    batchSize: 5
  }
});

For Read-Only Applications

For read-only applications where data doesn't change:

const brainy = new BrainyData({
  readOnly: true,
  cacheOptions: {
    // More aggressive caching for read-only data
    hotCacheEvictionThreshold: 0.9,
    warmCacheTTL: 72 * 60 * 60 * 1000 // 72 hours
  }
});

Advanced Configuration

Manual Cache Size Calculation

If you want to manually calculate the optimal cache size:

// Get memory information
async function getMemoryInfo() {
  if (typeof window === 'undefined') {
    // Node.js
    const os = await import('os');
    return {
      totalMemory: os.totalmem(),
      freeMemory: os.freemem()
    };
  } else if (navigator.deviceMemory) {
    // Browser with deviceMemory API
    const totalMemory = navigator.deviceMemory * 1024 * 1024 * 1024;
    return {
      totalMemory,
      freeMemory: totalMemory * 0.5 // Estimate
    };
  }
  // Default fallback
  return {
    totalMemory: 8 * 1024 * 1024 * 1024, // 8GB
    freeMemory: 4 * 1024 * 1024 * 1024   // 4GB
  };
}

// Calculate optimal cache size
async function calculateOptimalCacheSize() {
  const memoryInfo = await getMemoryInfo();
  const BYTES_PER_ENTRY = 1024; // Estimate 1KB per entry
  const memoryPercentage = 0.1; // Use 10% of free memory
  
  return Math.max(
    Math.floor(memoryInfo.freeMemory * memoryPercentage / BYTES_PER_ENTRY),
    1000 // Minimum size
  );
}

// Use the calculated size
async function initializeBrainy() {
  const optimalSize = await calculateOptimalCacheSize();
  
  const brainy = new BrainyData({
    cacheOptions: {
      hotCacheMaxSize: optimalSize
    }
  });
  
  return brainy;
}

Monitoring Cache Performance

You can monitor cache performance to fine-tune your settings:

// Get cache statistics
const stats = brainy.getCacheStats();

console.log('Cache Statistics:', {
  hotCacheSize: stats.hotCacheSize,
  hotCacheHits: stats.hotCacheHits,
  hotCacheMisses: stats.hotCacheMisses,
  warmCacheSize: stats.warmCacheSize,
  warmCacheHits: stats.warmCacheHits,
  warmCacheMisses: stats.warmCacheMisses
});

// Calculate hit ratios
const hotHitRatio = stats.hotCacheHits / (stats.hotCacheHits + stats.hotCacheMisses || 1);
const warmHitRatio = stats.warmCacheHits / (stats.warmCacheHits + stats.warmCacheMisses || 1);

console.log('Hit Ratios:', {
  hotHitRatio: hotHitRatio.toFixed(2),
  warmHitRatio: warmHitRatio.toFixed(2)
});

Conclusion

Brainy's enhanced cache system now provides better performance across all JavaScript environments with minimal configuration. The adaptive tuning system will automatically optimize cache parameters based on your specific workload and environment.

For most applications, the default settings with auto-tuning enabled will provide excellent performance. For specialized use cases, use the environment-specific configuration options to fine-tune the cache behavior.