π Caching Strategies in TuskLang - Bash Guide
Caching Strategies in TuskLang - Bash Guide
πΎ Revolutionary Caching Strategy Configuration
Caching strategies in TuskLang transform your configuration files into intelligent, multi-tier caching systems. No more simple key-value stores or rigid cache policiesβeverything lives in your TuskLang configuration with dynamic cache invalidation, intelligent prefetching, and comprehensive cache analytics.
> "We don't bow to any king" β TuskLang caching strategies break free from traditional cache constraints and bring modern caching capabilities to your Bash applications.
π Core Caching Strategy Directives
Basic Caching Strategy Setup
#caching: enabled # Enable caching
#cache-enabled: true # Alternative syntax
#cache-strategy: lru # Cache eviction strategy
#cache-ttl: 3600 # Time to live (seconds)
#cache-max-size: 1000 # Maximum cache size
#cache-prefetch: true # Enable cache prefetching
Advanced Caching Strategy Configuration
#cache-invalidation: smart # Cache invalidation strategy
#cache-distributed: true # Enable distributed caching
#cache-persistence: true # Enable cache persistence
#cache-compression: true # Enable cache compression
#cache-monitoring: true # Enable cache monitoring
#cache-analytics: true # Enable cache analytics
π§ Bash Caching Strategy Implementation
Basic Cache Manager
#!/bin/bashLoad caching strategy configuration
source <(tsk load caching-strategy.tsk)Caching strategy configuration
CACHE_ENABLED="${cache_enabled:-true}"
CACHE_STRATEGY="${cache_strategy:-lru}"
CACHE_TTL="${cache_ttl:-3600}"
CACHE_MAX_SIZE="${cache_max_size:-1000}"
CACHE_PREFETCH="${cache_prefetch:-true}"Cache manager
class CacheManager {
constructor() {
this.enabled = CACHE_ENABLED
this.strategy = CACHE_STRATEGY
this.ttl = CACHE_TTL
this.maxSize = CACHE_MAX_SIZE
this.prefetch = CACHE_PREFETCH
this.cache = new Map()
this.accessTimes = new Map()
this.stats = {
hits: 0,
misses: 0,
evictions: 0,
sets: 0
}
}
get(key) {
if (!this.enabled) return null
const item = this.cache.get(key)
if (item && !this.isExpired(item)) {
this.accessTimes.set(key, Date.now())
this.stats.hits++
return item.value
}
this.stats.misses++
return null
}
set(key, value, ttl = this.ttl) {
if (!this.enabled) return
// Check if cache is full
if (this.cache.size >= this.maxSize) {
this.evict()
}
const item = {
value,
timestamp: Date.now(),
ttl: ttl * 1000
}
this.cache.set(key, item)
this.accessTimes.set(key, Date.now())
this.stats.sets++
}
isExpired(item) {
return Date.now() - item.timestamp > item.ttl
}
evict() {
switch (this.strategy) {
case 'lru':
this.evictLRU()
break
case 'lfu':
this.evictLFU()
break
case 'fifo':
this.evictFIFO()
break
default:
this.evictLRU()
}
}
evictLRU() {
let oldestKey = null
let oldestTime = Date.now()
for (const [key, time] of this.accessTimes) {
if (time < oldestTime) {
oldestTime = time
oldestKey = key
}
}
if (oldestKey) {
this.cache.delete(oldestKey)
this.accessTimes.delete(oldestKey)
this.stats.evictions++
}
}
evictLFU() {
// Implementation for LFU eviction
this.stats.evictions++
}
evictFIFO() {
// Implementation for FIFO eviction
this.stats.evictions++
}
getStats() {
return { ...this.stats }
}
clear() {
this.cache.clear()
this.accessTimes.clear()
}
}Initialize cache manager
const cacheManager = new CacheManager()
Dynamic Cache Operations
#!/bin/bashDynamic cache operations
cache_get() {
local key="$1"
local cache_dir="${cache_directory:-/tmp/cache}"
local cache_file="$cache_dir/$key"
if [[ -f "$cache_file" ]]; then
local timestamp=$(jq -r '.timestamp' "$cache_file" 2>/dev/null)
local ttl=$(jq -r '.ttl' "$cache_file" 2>/dev/null)
local current_time=$(date +%s)
# Check if cache is expired
if [[ $((current_time - timestamp)) -lt $ttl ]]; then
local value=$(jq -r '.value' "$cache_file" 2>/dev/null)
echo "$value"
return 0
else
# Remove expired cache
rm -f "$cache_file"
fi
fi
return 1
}cache_set() {
local key="$1"
local value="$2"
local ttl="${3:-3600}"
local cache_dir="${cache_directory:-/tmp/cache}"
local cache_file="$cache_dir/$key"
# Create cache directory
mkdir -p "$cache_dir"
# Create cache entry
cat > "$cache_file" << EOF
{
"key": "$key",
"value": "$value",
"timestamp": $(date +%s),
"ttl": $ttl
}
EOF
echo "β Cache set: $key"
}
cache_delete() {
local key="$1"
local cache_dir="${cache_directory:-/tmp/cache}"
local cache_file="$cache_dir/$key"
if [[ -f "$cache_file" ]]; then
rm -f "$cache_file"
echo "β Cache deleted: $key"
else
echo "Cache not found: $key"
fi
}
cache_clear() {
local cache_dir="${cache_directory:-/tmp/cache}"
if [[ -d "$cache_dir" ]]; then
rm -rf "$cache_dir"/*
echo "β Cache cleared"
fi
}
Intelligent Cache Invalidation
#!/bin/bashIntelligent cache invalidation
smart_cache_invalidation() {
local pattern="$1"
local cache_dir="${cache_directory:-/tmp/cache}"
# Find and invalidate matching cache entries
find "$cache_dir" -name "$pattern" -type f -delete
echo "β Smart cache invalidation completed for pattern: $pattern"
}cache_invalidation_by_time() {
local max_age="${1:-3600}" # seconds
local cache_dir="${cache_directory:-/tmp/cache}"
local current_time=$(date +%s)
# Find and remove old cache entries
find "$cache_dir" -name "*.json" -type f -exec sh -c '
for file do
local timestamp=$(jq -r ".timestamp" "$file" 2>/dev/null || echo 0)
if [[ $((current_time - timestamp)) -gt $max_age ]]; then
rm -f "$file"
fi
done
' sh {} +
echo "β Cache invalidation by time completed (max age: ${max_age}s)"
}
cache_invalidation_by_size() {
local max_size="${1:-1000}" # entries
local cache_dir="${cache_directory:-/tmp/cache}"
# Count cache entries
local count=$(find "$cache_dir" -name "*.json" -type f | wc -l)
if [[ $count -gt $max_size ]]; then
# Remove oldest entries
local to_remove=$((count - max_size))
find "$cache_dir" -name "*.json" -type f -printf '%T@ %p\n' | sort -n | head -n "$to_remove" | cut -d' ' -f2- | xargs rm -f
echo "β Cache invalidation by size completed (removed $to_remove entries)"
else
echo "Cache size within limits ($count/$max_size)"
fi
}
Cache Prefetching
#!/bin/bashCache prefetching
cache_prefetch() {
local key_pattern="$1"
local data_source="$2"
local ttl="${3:-3600}"
echo "Prefetching cache for pattern: $key_pattern"
# Generate keys to prefetch
local keys=($(generate_prefetch_keys "$key_pattern"))
for key in "${keys[@]}"; do
# Fetch data from source
local data=$(fetch_data_from_source "$data_source" "$key")
if [[ -n "$data" ]]; then
# Cache the data
cache_set "$key" "$data" "$ttl"
echo "β Prefetched: $key"
fi
done
echo "β Cache prefetching completed"
}generate_prefetch_keys() {
local pattern="$1"
# Generate keys based on pattern
case "$pattern" in
"user_*")
echo "user_profile user_settings user_preferences"
;;
"config_*")
echo "config_system config_application config_database"
;;
"data_*")
echo "data_recent data_popular data_trending"
;;
*)
echo "default_key"
;;
esac
}
fetch_data_from_source() {
local source="$1"
local key="$2"
case "$source" in
"database")
fetch_from_database "$key"
;;
"api")
fetch_from_api "$key"
;;
"file")
fetch_from_file "$key"
;;
*)
echo "default_data"
;;
esac
}
Distributed Caching
#!/bin/bashDistributed caching
distributed_cache_get() {
local key="$1"
local cache_nodes=("${cache_nodes[@]:-localhost:6379}")
for node in "${cache_nodes[@]}"; do
local host="${node%:*}"
local port="${node#*:}"
# Try to get from this node
local value=$(redis-cli -h "$host" -p "$port" GET "$key" 2>/dev/null)
if [[ -n "$value" ]]; then
echo "$value"
return 0
fi
done
return 1
}distributed_cache_set() {
local key="$1"
local value="$2"
local ttl="${3:-3600}"
local cache_nodes=("${cache_nodes[@]:-localhost:6379}")
# Set in all nodes for redundancy
for node in "${cache_nodes[@]}"; do
local host="${node%:*}"
local port="${node#*:}"
redis-cli -h "$host" -p "$port" SETEX "$key" "$ttl" "$value" >/dev/null 2>&1
done
echo "β Distributed cache set: $key"
}
distributed_cache_sync() {
local source_node="${1:-localhost:6379}"
local target_nodes=("${@:2}")
echo "Synchronizing cache from $source_node to ${#target_nodes[@]} nodes..."
# Get all keys from source
local host="${source_node%:*}"
local port="${source_node#*:}"
local keys=$(redis-cli -h "$host" -p "$port" KEYS "*" 2>/dev/null)
for key in $keys; do
local value=$(redis-cli -h "$host" -p "$port" GET "$key" 2>/dev/null)
local ttl=$(redis-cli -h "$host" -p "$port" TTL "$key" 2>/dev/null)
# Set in target nodes
for target_node in "${target_nodes[@]}"; do
local target_host="${target_node%:*}"
local target_port="${target_node#*:}"
if [[ $ttl -gt 0 ]]; then
redis-cli -h "$target_host" -p "$target_port" SETEX "$key" "$ttl" "$value" >/dev/null 2>&1
else
redis-cli -h "$target_host" -p "$target_port" SET "$key" "$value" >/dev/null 2>&1
fi
done
done
echo "β Distributed cache synchronization completed"
}
Cache Analytics
#!/bin/bashCache analytics
cache_analytics() {
local cache_dir="${cache_directory:-/tmp/cache}"
local analytics_file="/var/log/cache_analytics.json"
# Collect cache statistics
local total_entries=$(find "$cache_dir" -name "*.json" -type f | wc -l)
local total_size=$(du -sb "$cache_dir" 2>/dev/null | cut -f1)
local hit_count=0
local miss_count=0
# Read hit/miss counts from log
if [[ -f "/var/log/cache.log" ]]; then
hit_count=$(grep -c "HIT" "/var/log/cache.log" 2>/dev/null || echo 0)
miss_count=$(grep -c "MISS" "/var/log/cache.log" 2>/dev/null || echo 0)
fi
# Calculate hit rate
local total_requests=$((hit_count + miss_count))
local hit_rate=0
if [[ $total_requests -gt 0 ]]; then
hit_rate=$(echo "scale=2; $hit_count * 100 / $total_requests" | bc -l)
fi
# Generate analytics report
cat > "$analytics_file" << EOF
{
"timestamp": "$(date -Iseconds)",
"total_entries": $total_entries,
"total_size_bytes": $total_size,
"hit_count": $hit_count,
"miss_count": $miss_count,
"hit_rate_percent": $hit_rate,
"cache_efficiency": "$(calculate_cache_efficiency $hit_rate)"
}
EOF
echo "β Cache analytics generated: $analytics_file"
}calculate_cache_efficiency() {
local hit_rate="$1"
if [[ $(echo "$hit_rate >= 80" | bc -l) -eq 1 ]]; then
echo "excellent"
elif [[ $(echo "$hit_rate >= 60" | bc -l) -eq 1 ]]; then
echo "good"
elif [[ $(echo "$hit_rate >= 40" | bc -l) -eq 1 ]]; then
echo "fair"
else
echo "poor"
fi
}
π― Real-World Configuration Examples
Complete Caching Strategy Configuration
caching-strategy-config.tsk
caching_strategy_config:
enabled: true
strategy: lru
ttl: 3600
max_size: 1000
prefetch: true#caching: enabled
#cache-enabled: true
#cache-strategy: lru
#cache-ttl: 3600
#cache-max-size: 1000
#cache-prefetch: true
#cache-invalidation: smart
#cache-distributed: true
#cache-persistence: true
#cache-compression: true
#cache-monitoring: true
#cache-analytics: true
#cache-config:
general:
strategy: lru
ttl: 3600
max_size: 1000
prefetch: true
invalidation:
strategy: smart
patterns:
- "user_*"
- "config_*"
- "data_*"
time_based: true
size_based: true
distributed:
enabled: true
nodes:
- "localhost:6379"
- "cache1.example.com:6379"
- "cache2.example.com:6379"
sync_interval: 300
persistence:
enabled: true
directory: "/var/cache"
compression: true
backup: true
monitoring:
enabled: true
metrics:
- "hit_rate"
- "miss_rate"
- "eviction_rate"
- "size"
analytics:
enabled: true
interval: 60
retention: "7d"
prefetch:
enabled: true
patterns:
user_profile: "user_*"
config_data: "config_*"
popular_data: "data_*"
Multi-Tier Caching
multi-tier-caching.tsk
multi_tier_caching:
tiers:
- name: l1
type: memory
size: 100
ttl: 300
- name: l2
type: disk
size: 1000
ttl: 3600
- name: l3
type: distributed
size: 10000
ttl: 86400#cache-l1: memory:100:300
#cache-l2: disk:1000:3600
#cache-l3: distributed:10000:86400
#cache-config:
tiers:
l1:
type: memory
size: 100
ttl: 300
strategy: lru
l2:
type: disk
size: 1000
ttl: 3600
strategy: lru
l3:
type: distributed
size: 10000
ttl: 86400
strategy: lru
π¨ Troubleshooting Caching Strategies
Common Issues and Solutions
1. Cache Performance Issues
Debug cache performance
debug_cache_performance() {
echo "Debugging cache performance..."
cache_analytics
echo "Cache performance analysis completed"
}
2. Cache Invalidation Issues
Debug cache invalidation
debug_cache_invalidation() {
local pattern="$1"
echo "Debugging cache invalidation for pattern: $pattern"
smart_cache_invalidation "$pattern"
}
π Security Best Practices
Caching Strategy Security Checklist
Security validation
validate_caching_strategy_security() {
echo "Validating caching strategy security configuration..."
# Check cache encryption
if [[ "${cache_encryption}" == "true" ]]; then
echo "β Cache encryption enabled"
else
echo "β Cache encryption not enabled"
fi
# Check cache access controls
if [[ "${cache_access_controls}" == "true" ]]; then
echo "β Cache access controls enabled"
else
echo "β Cache access controls not enabled"
fi
# Check cache data sanitization
if [[ "${cache_data_sanitization}" == "true" ]]; then
echo "β Cache data sanitization enabled"
else
echo "β Cache data sanitization not enabled"
fi
}
π Performance Optimization Tips
Caching Strategy Performance Checklist
Performance validation
validate_caching_strategy_performance() {
echo "Validating caching strategy performance configuration..."
# Check cache size
local max_size="${cache_max_size:-1000}"
if [[ "$max_size" -le 10000 ]]; then
echo "β Reasonable cache size ($max_size)"
else
echo "β Large cache size may impact memory usage ($max_size)"
fi
# Check TTL
local ttl="${cache_ttl:-3600}" # seconds
if [[ "$ttl" -ge 300 ]]; then
echo "β Reasonable TTL ($ttl s)"
else
echo "β Short TTL may impact cache effectiveness ($ttl s)"
fi
# Check prefetching
if [[ "${cache_prefetch}" == "true" ]]; then
echo "β Cache prefetching enabled"
else
echo "β Cache prefetching not enabled"
fi
}
π― Next Steps
- Cache Optimization: Learn about advanced cache optimization - Cache Visualization: Create cache visualization dashboards - Cache Correlation: Implement cache correlation and alerting - Cache Compliance: Set up cache compliance and auditing
---
Caching strategies transform your TuskLang configuration into an intelligent, multi-tier caching system. It brings modern caching capabilities to your Bash applications with dynamic invalidation, intelligent prefetching, and comprehensive analytics!