Generates Cache-Aside pattern for PHP 8.4. Creates cache executor with PSR-16 integration, stampede protection via distributed locking, tag-based invalidation, and key generation. Includes unit tests.
From accnpx claudepluginhub dykyi-roman/awesome-claude-code --plugin accThis skill uses the workspace's default tool permissions.
references/examples.mdreferences/templates.mdCreates Cache-Aside infrastructure with stampede protection and tag-based invalidation.
| Scenario | Example |
|---|---|
| Read-heavy workloads | Product catalog, user profiles |
| Expensive queries | Complex reports, aggregated data |
| External API responses | Third-party API caching |
| Computed values | Pricing calculations, search results |
get(string $key, callable $loader, int $ttl): mixed — load from cache or computeinvalidate(string $key): void — remove specific cache entryinvalidateByTag(string $tag): void — remove all entries tagged with given tagPath: src/Domain/Shared/Cache/
CacheAsideInterface.php — Cache-aside contractCacheKeyGeneratorInterface.php — Key generation contractPath: src/Infrastructure/Cache/
CacheKeyGenerator.php — Key builder with hashingCacheAsideExecutor.php — PSR-16 cache executor with lockingCacheInvalidator.php — Tag-based and pattern-based invalidationCacheLockInterface.php — Distributed lock contractRedisCacheLock.php — Redis-based lock implementationCacheKeyGeneratorTest.php — Key generation and hashing testsCacheAsideExecutorTest.php — Cache hit/miss, stampede protection testsCacheInvalidatorTest.php — Tag and pattern invalidation tests| Component | Path |
|---|---|
| Domain Interfaces | src/Domain/Shared/Cache/ |
| Infrastructure | src/Infrastructure/Cache/ |
| Unit Tests | tests/Unit/Infrastructure/Cache/ |
| Component | Pattern | Example |
|---|---|---|
| Interface | CacheAsideInterface | CacheAsideInterface |
| Key Generator | CacheKeyGenerator | CacheKeyGenerator |
| Executor | CacheAsideExecutor | CacheAsideExecutor |
| Invalidator | CacheInvalidator | CacheInvalidator |
| Lock Interface | CacheLockInterface | CacheLockInterface |
| Lock Impl | {Store}CacheLock | RedisCacheLock |
| Test | {ClassName}Test | CacheAsideExecutorTest |
interface CacheAsideInterface
{
/**
* @template T
* @param callable(): T $loader
* @return T
*/
public function get(string $key, callable $loader, int $ttl = 3600): mixed;
public function invalidate(string $key): void;
public function invalidateByTag(string $tag): void;
}
final readonly class CacheKeyGenerator
{
public function __construct(private string $prefix = 'app');
public function generate(string $context, string ...$parts): string;
public function generateHashed(string $context, string ...$parts): string;
}
interface CacheLockInterface
{
public function acquire(string $key, int $ttl = 10): bool;
public function release(string $key): void;
}
$executor = new CacheAsideExecutor($cache, $lock, defaultTtl: 3600);
// Cache-aside: returns cached value or computes via loader
$product = $executor->get(
key: 'product:123',
loader: fn() => $repository->findById(123),
ttl: 1800
);
// Invalidate on update
$executor->invalidate('product:123');
// Tag-based invalidation
$invalidator->invalidateByTag('products');
| Pattern | Description | Use Case |
|---|---|---|
| Cache-Aside | App manages cache (check → miss → load → store) | Read-heavy, tolerates stale data |
| Read-Through | Cache loads data on miss (transparent to app) | Simpler app code, cache manages loading |
| Write-Through | Write to cache and DB simultaneously | Strong consistency needed |
| Write-Behind | Write to cache, async write to DB | High write throughput, eventual consistency |
| Anti-pattern | Problem | Solution |
|---|---|---|
| No TTL | Stale data served forever | Always set TTL, even long ones |
| Thundering herd | All requests compute on cache miss | Stampede protection with locking |
| Cache poisoning | Invalid data cached | Validate data before caching |
| Inconsistent invalidation | Update DB but forget cache | Use events/listeners for invalidation |
| Key collisions | Different data for same key | Use prefix + context + params |
| Over-caching | Memory waste, stale data | Cache only expensive/frequent operations |
For complete PHP templates and examples, see:
references/templates.md — CacheAsideInterface, CacheKeyGenerator, CacheAsideExecutor, CacheInvalidator, lock templatesreferences/examples.md — Repository integration, event-driven invalidation, and unit testsProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.