235 lines
6 KiB
Markdown
235 lines
6 KiB
Markdown
|
|
# 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
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
// The cache will automatically detect available memory
|
||
|
|
const brainy = new BrainyData();
|
||
|
|
```
|
||
|
|
|
||
|
|
### Environment-Specific Configuration
|
||
|
|
|
||
|
|
You can now specify different cache configurations for each environment:
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
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
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
// 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):
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
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:
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
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:
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
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:
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
// 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:
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
// 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.
|