Centralized Cache Configuration
The CQL library provides a comprehensive, centralized cache configuration system that allows you to configure all caching functionality from one place. This approach follows SOLID principles and provides a clean, maintainable way to manage cache settings across your entire application.
Overview
Instead of configuring cache settings in multiple places across your application, CQL's centralized configuration allows you to:
Configure all cache settings in one place
Apply environment-specific defaults automatically
Validate configuration at startup
Access cache functionality through a unified API
Monitor and manage cache performance centrally
Basic Configuration
require "cql"
CQL.configure do |config|
config.database_url = "postgresql://localhost/myapp"
# Enable caching with basic settings
config.cache.enabled = true
config.cache.default_ttl = 30.minutes
config.cache.key_prefix = "myapp"
end
Cache Configuration Options
The cache configuration is accessed through config.cache
and provides the following options:
Core Settings
enabled
Bool
false
Enable or disable the entire cache system
default_ttl
Time::Span
1.hour
Default time-to-live for cache entries
key_prefix
String
"cql"
Prefix for all cache keys
cache_name
String
"cql"
Name for the cache instance
Memory Cache Settings
enable_memory_cache
Bool
true
Enable in-memory caching
memory_cache_max_size
Int32?
1000
Maximum number of entries in memory cache
memory_cache_enable_statistics
Bool
true
Enable statistics collection for memory cache
Request-Scoped Cache Settings
enable_request_cache
Bool
true
Enable per-request query caching
request_cache_max_size
Int32
1000
Maximum entries per request
auto_clear_request_cache
Bool
true
Automatically clear cache between requests
Fragment Cache Settings
enable_fragment_cache
Bool
false
Enable fragment caching
fragment_cache_enable_versioning
Bool
true
Enable version-based invalidation
fragment_cache_enable_tagging
Bool
true
Enable tag-based invalidation
Invalidation Strategy Settings
invalidation_strategy
String
"timestamp"
Strategy for cache invalidation ("timestamp"
, "version"
, "transaction_aware"
)
max_cache_age
Time::Span
1.hour
Maximum age for timestamp-based invalidation
Performance and Monitoring
enable_cache_statistics
Bool
true
Enable cache performance statistics
enable_cache_logging
Bool
false
Enable cache operation logging
cache_log_level
Log::Severity
Debug
Log level for cache operations
Advanced Settings
auto_cleanup_expired
Bool
true
Automatically clean up expired entries
cleanup_interval
Time::Span
5.minutes
Interval for cleanup operations
enable_batch_operations
Bool
true
Enable batch cache operations
Middleware Integration
enable_middleware_integration
Bool
false
Enable automatic middleware integration
middleware_request_id_header
String
"X-Request-ID"
Header name for request ID tracking
Environment-Specific Defaults
The cache configuration automatically applies environment-specific defaults:
Development Environment
enabled = true
enable_cache_logging = true
cache_log_level = Debug
memory_cache_max_size = 1000
request_cache_max_size = 1000
Test Environment
enabled = false
(disabled by default for test isolation)enable_cache_logging = false
memory_cache_max_size = 100
request_cache_max_size = 100
Production Environment
enabled = false
(disabled by default for safety)enable_cache_logging = false
cache_log_level = Info
memory_cache_max_size = 5000
request_cache_max_size = 2000
Comprehensive Configuration Example
CQL.configure do |config|
config.database_url = "postgresql://localhost/myapp"
# Core cache settings
config.cache.enabled = true
config.cache.default_ttl = 45.minutes
config.cache.key_prefix = "myapp"
# Memory cache configuration
config.cache.enable_memory_cache = true
config.cache.memory_cache_max_size = 2000
config.cache.memory_cache_enable_statistics = true
# Request-scoped caching
config.cache.enable_request_cache = true
config.cache.request_cache_max_size = 1000
config.cache.auto_clear_request_cache = true
# Fragment caching
config.cache.enable_fragment_cache = true
config.cache.fragment_cache_enable_versioning = true
config.cache.fragment_cache_enable_tagging = true
# Invalidation strategy
config.cache.invalidation_strategy = "transaction_aware"
config.cache.max_cache_age = 2.hours
# Performance monitoring
config.cache.enable_cache_statistics = true
config.cache.enable_cache_logging = true
config.cache.cache_log_level = Log::Severity::Info
# Advanced features
config.cache.auto_cleanup_expired = true
config.cache.cleanup_interval = 10.minutes
config.cache.enable_batch_operations = true
# Web framework integration
config.cache.enable_middleware_integration = true
config.cache.middleware_request_id_header = "X-Request-ID"
end
Cache Management API
Once configured, you can manage the cache system through the CQL module:
Enable/Disable Cache
# Enable caching
CQL.enable_cache(true)
# Check if caching is enabled
if CQL.cache_enabled?
puts "Cache is enabled"
end
# Disable caching
CQL.enable_cache(false)
Statistics and Monitoring
# Get cache statistics
stats = CQL.cache_stats
puts "Hit rate: #{stats["hit_rate_percent"]}%"
# Get performance summary
puts CQL.cache_performance
# Reset statistics
CQL.reset_cache_stats
Request-Scoped Caching
# Manual request cache management
CQL.start_request_cache("request-123")
# ... perform database operations
CQL.end_request_cache
# Or use block syntax
CQL.with_request_cache("request-123") do
# ... perform database operations
# Cache is automatically cleared when block exits
end
Create Cache Instances
# Create a memory cache instance
memory_cache = CQL.create_memory_cache
# Create a fragment cache instance
fragment_cache = CQL.create_fragment_cache
Web Framework Integration
The centralized configuration works seamlessly with web framework middleware:
Kemal
require "cql/cache/middleware"
CQL.configure do |config|
config.cache.enabled = true
config.cache.enable_middleware_integration = true
end
before_all do |env|
CQL::Cache::Middleware::Kemal.before_request(env)
end
after_all do |env|
CQL::Cache::Middleware::Kemal.after_request(env)
end
Lucky
abstract class ApplicationAction < Lucky::Action
include CQL::Cache::Middleware::Lucky
end
Configuration Validation
The configuration system includes comprehensive validation:
begin
CQL.configure do |config|
config.cache.enabled = true
config.cache.memory_cache_max_size = -1 # Invalid!
end
rescue ArgumentError => e
puts "Invalid configuration: #{e.message}"
end
Best Practices
Environment-Specific Configuration: Override defaults for production environments
Memory Limits: Set appropriate
memory_cache_max_size
based on available memoryTTL Settings: Configure
default_ttl
based on your data freshness requirementsRequest Caching: Enable for web applications to eliminate duplicate queries
Fragment Caching: Use for expensive computations or complex query results
Monitoring: Enable statistics in development but consider disabling logging in production
Invalidation Strategy: Choose the strategy that best fits your data consistency needs
Production Configuration Example
CQL.configure do |config|
config.database_url = ENV["DATABASE_URL"]
config.environment = "production"
# Production cache settings
config.cache.enabled = true
config.cache.default_ttl = 1.hour
config.cache.memory_cache_max_size = 10000
config.cache.enable_request_cache = true
config.cache.invalidation_strategy = "version"
config.cache.enable_cache_logging = false
config.cache.enable_cache_statistics = true
config.cache.enable_middleware_integration = true
end
This centralized approach provides a clean, maintainable way to configure all caching functionality while ensuring optimal performance and proper resource management across different environments.
Last updated
Was this helpful?