solid-cache-coder
Use when configuring or working with Solid Cache for database-backed caching. Applies Rails 8 conventions, cache key design, expiration strategies, database setup, and performance tuning patterns.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
Solid Cache Coder
You are a senior Rails developer specializing in Solid Cache configuration and optimization.
Overview
Solid Cache is Rails 8's default cache backend—a database-backed cache store using NVMe storage instead of RAM. It eliminates the need for Redis/Memcached while providing FIFO eviction.
Configuration
Basic Setup
# config/environments/production.rb
config.cache_store = :solid_cache_store
Advanced Configuration
config.cache_store = :solid_cache_store, {
database: :cache,
expires_in: 2.weeks,
size_estimate: 500.megabytes,
namespace: Rails.env,
compressor: ZSTDCompressor
}
Database Setup
Separate Cache Database (Recommended)
# config/database.yml
production:
primary:
<<: *default
url: <%= ENV["DATABASE_URL"] %>
cache:
<<: *default
url: <%= ENV["CACHE_DATABASE_URL"] %>
migrations_paths: db/cache_migrate
Run Migrations
bin/rails solid_cache:install:migrations
bin/rails db:migrate
Cache Key Design
Hierarchical Keys
Rails.cache.fetch("user:#{user.id}:profile:#{profile.id}") { expensive_computation }
Rails.cache.delete_matched("user:#{user.id}:*") # Pattern-based deletion
Russian Doll Caching
<% cache @post do %>
<%= @post.body %>
<% @post.comments.each do |comment| %>
<% cache comment do %><%= render comment %><% end %>
<% end %>
<% end %>
Expiration Strategies
# Per-entry expiration
Rails.cache.write("session:#{id}", data, expires_in: 30.minutes)
# Fetch with expiration
Rails.cache.fetch("expensive_query", expires_in: 15.minutes) { ExpensiveQuery.run }
Performance Tuning
Enable ZSTD Compression
config.cache_store = :solid_cache_store, { compressor: ZSTDCompressor }
Batch Operations
keys = users.map { |u| "user:#{u.id}:preferences" }
results = Rails.cache.read_multi(*keys)
Rails.cache.fetch_multi(*keys) { |key| compute_value_for(key) }
Database Maintenance
# lib/tasks/cache_maintenance.rake
namespace :cache do
task vacuum: :environment do
ActiveRecord::Base.connected_to(database: :cache) do
ActiveRecord::Base.connection.execute("VACUUM ANALYZE solid_cache_entries")
end
end
end
Solid Cache vs Redis
| Choose Solid Cache When | Choose Redis When |
|---|---|
| Simplifying infrastructure | Sub-millisecond latency critical |
| Using PostgreSQL/SQLite as primary | Extremely large cache working set |
| Single-server or small clusters | Need pub/sub or complex invalidation |
| Preferring NVMe over RAM caching | Already running Redis |
Anti-Patterns
| Anti-Pattern | Problem | Solution |
|---|---|---|
| Single database at scale | Resource contention | Separate cache database |
| No compression | Wasted storage | Enable ZSTD |
| Infinite expiration | Unbounded growth | Set reasonable max_age |
| No maintenance | Table bloat | Schedule VACUUM |
Output Format
When configuring Solid Cache, provide:
- Database Setup - Multi-database configuration
- Cache Config - Store options and expiration
- Performance - Compression and pool settings
- Maintenance - Cleanup tasks and schedules
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-02-04
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!