Table of Contents
When you’re debugging data inconsistencies in Laravel and suspect caching might be the culprit, here’s a pattern that can save hours of investigation.
The Problem
You have a calculator class that computes prices. Sometimes it returns stale data from Redis, sometimes fresh data from the database. The bug is intermittent and hard to reproduce. How do you prove cache is the issue?
The Debug Pattern
Add a cache parameter to your method and compare both results side-by-side:
// Test with cache enabled (default behavior)
$cachedPrice = $calculator->calculate($orderId);
// Test with cache explicitly disabled
$freshPrice = $calculator->calculate($orderId, use_cache: false);
if ($cachedPrice !== $freshPrice) {
// Cache poisoning confirmed
}
This immediately tells you if cache is the problem without clearing cache globally or adding debug logging everywhere.
The Implementation
Add a boolean parameter to methods that might cache data:
class PriceCalculator
{
public function calculate(
int $orderId,
bool $use_cache = true
): float {
if (!$use_cache) {
return $this->calculateFromDatabase($orderId);
}
return Cache::remember(
"order_price_{$orderId}",
now()->addHours(1),
fn() => $this->calculateFromDatabase($orderId)
);
}
private function calculateFromDatabase(int $orderId): float
{
// Fresh calculation from DB
return Order::find($orderId)->items->sum('total');
}
}
Use Named Parameters
PHP 8+ named parameters make cache-disabling calls self-documenting:
// Clear intent - this call bypasses cache
$price = $calculator->calculate($orderId, use_cache: false);
// vs the old way (less obvious)
$price = $calculator->calculate($orderId, false);
When to Disable Cache
Keep cache enabled by default (performance), but disable it for operations where stale data causes bugs:
class OrderRepository
{
public function create(array $data): Order
{
// Order creation must use fresh prices
$price = $this->calculator->calculate(
$data['product_id'],
use_cache: false
);
return Order::create([
'product_id' => $data['product_id'],
'price' => $price,
]);
}
}
Takeaway
When you suspect cache issues, don’t guess. Add a cache parameter, compare results, and you’ll know instantly if cache is the problem. Then you can fix it surgically without breaking performance elsewhere.
Leave a Reply