Module: Tina4::CacheBackends
- Defined in:
- lib/tina4/cache_backends.rb,
lib/tina4/cache_backends/base_backend.rb,
lib/tina4/cache_backends/file_backend.rb,
lib/tina4/cache_backends/mongo_backend.rb,
lib/tina4/cache_backends/redis_backend.rb,
lib/tina4/cache_backends/memory_backend.rb,
lib/tina4/cache_backends/valkey_backend.rb,
lib/tina4/cache_backends/database_backend.rb,
lib/tina4/cache_backends/memcached_backend.rb
Overview
Unified cache backend family (parity with Python tina4_python.cache).
Backends are key/value stores with TTL semantics, selected via env vars:
memory — in-process LRU cache (default, zero deps)
file — JSON files in data/cache/
redis — Redis (redis gem or raw RESP over TCP)
valkey — Valkey (Redis wire protocol; reports "valkey")
memcached — Memcached (zero-dep text protocol over TCP)
mongodb — MongoDB TTL collection (requires the mongo gem)
database — tina4_cache table in any Tina4-supported database
Environment:
TINA4_CACHE_BACKEND — memory|file|redis|valkey|memcached|mongodb|database
TINA4_CACHE_URL — connection URL (redis/valkey/memcached/mongo) OR
SQL URL for database (falls back to TINA4_DATABASE_URL)
TINA4_CACHE_TTL — default TTL in seconds (default: 60)
TINA4_CACHE_MAX_ENTRIES — max cached entries (default: 1000)
TINA4_CACHE_DIR — file backend directory (default: data/cache)
TINA4_CACHE_USERNAME / TINA4_CACHE_PASSWORD — credentials when not in the URL
Defined Under Namespace
Classes: BaseBackend, DatabaseBackend, FileBackend, MemcachedBackend, MemoryBackend, MongoBackend, RedisBackend, ValkeyBackend
Class Method Summary collapse
-
.create_backend(backend: nil, url: nil, max_entries: nil, cache_dir: nil) ⇒ Tina4::CacheBackends::BaseBackend
Create a cache backend from explicit params or env vars.
Class Method Details
.create_backend(backend: nil, url: nil, max_entries: nil, cache_dir: nil) ⇒ Tina4::CacheBackends::BaseBackend
Create a cache backend from explicit params or env vars.
Graceful degradation: if the configured backend’s driver is missing or its service is unreachable, the factory logs a warning and falls back to the file backend (persistent, zero-dep, always available) — never a silent no-op cache.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/tina4/cache_backends.rb', line 48 def create_backend(backend: nil, url: nil, max_entries: nil, cache_dir: nil) backend ||= ENV.fetch("TINA4_CACHE_BACKEND", "memory") max_entries ||= (ENV["TINA4_CACHE_MAX_ENTRIES"] || "1000").to_i backend = backend.to_s.downcase.strip be = case backend when "redis" RedisBackend.new(url: url || ENV.fetch("TINA4_CACHE_URL", "redis://localhost:6379"), max_entries: max_entries) when "valkey" ValkeyBackend.new(url: url || ENV.fetch("TINA4_CACHE_URL", "valkey://localhost:6379"), max_entries: max_entries) when "memcached", "memcache" MemcachedBackend.new(url: url || ENV.fetch("TINA4_CACHE_URL", "memcached://localhost:11211"), max_entries: max_entries) when "mongodb", "mongo" MongoBackend.new(url: url || ENV.fetch("TINA4_CACHE_URL", "mongodb://localhost:27017"), max_entries: max_entries) when "database", "db" DatabaseBackend.new(url: url, max_entries: max_entries) when "file" dir = cache_dir || ENV.fetch("TINA4_CACHE_DIR", "data/cache") return FileBackend.new(cache_dir: dir, max_entries: max_entries) else return MemoryBackend.new(max_entries: max_entries) end return be if be.available? # Configured backend unusable — degrade to the file backend. begin Tina4::Log.warning( "Cache backend '#{backend}' is unavailable " \ "(driver missing or service unreachable) — falling back to 'file'." ) rescue StandardError # Logging must never break cache construction. end dir = cache_dir || ENV.fetch("TINA4_CACHE_DIR", "data/cache") FileBackend.new(cache_dir: dir, max_entries: max_entries) end |