From 65267d7b519a615a0e14515ae63f26eab29117c4 Mon Sep 17 00:00:00 2001 From: Ameer Fakhri Date: Wed, 16 Oct 2024 00:13:17 +0300 Subject: [PATCH 1/2] fix(CacheableQueryBuilder): remove expired items from tagged cache This fix addresses a Redis behavior where expired items in sorted sets are not automatically removed. By calling flushStale() before cache operations, we ensure expired items are cleared, maintaining cache accuracy and preventing stale data issues. --- src/Database/Query/CacheableQueryBuilder.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Database/Query/CacheableQueryBuilder.php b/src/Database/Query/CacheableQueryBuilder.php index 2a889cf..8caca62 100644 --- a/src/Database/Query/CacheableQueryBuilder.php +++ b/src/Database/Query/CacheableQueryBuilder.php @@ -136,6 +136,11 @@ protected function runSelect() //and create additional identifiers $modelClasses = $this->getIdentifiableModelClasses($this->getIdentifiableValue()); + // clear expired cached queries in tagged cache + if ($isTaggableStore) { + Cache::tags($modelClasses)->flushStale(); + } + //If cached, return if (($isTaggableStore && Cache::tags($modelClasses)->has($cacheKey)) || Cache::has($cacheKey)) { $this->log("Found cache entry for '{$cacheKey}'"); From 03304ba52b9e589c0f22fac8420267ca215dfccb Mon Sep 17 00:00:00 2001 From: Ameer Fakhri Date: Wed, 16 Oct 2024 09:32:26 +0300 Subject: [PATCH 2/2] Update CacheableQueryBuilder.php --- src/Database/Query/CacheableQueryBuilder.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Database/Query/CacheableQueryBuilder.php b/src/Database/Query/CacheableQueryBuilder.php index 8caca62..c5feedc 100644 --- a/src/Database/Query/CacheableQueryBuilder.php +++ b/src/Database/Query/CacheableQueryBuilder.php @@ -2,6 +2,7 @@ namespace ElipZis\Cacheable\Database\Query; +use Illuminate\Cache\RedisTaggedCache; use Illuminate\Cache\TaggableStore; use Illuminate\Database\Connection; use Illuminate\Database\Query\Builder; @@ -137,10 +138,10 @@ protected function runSelect() $modelClasses = $this->getIdentifiableModelClasses($this->getIdentifiableValue()); // clear expired cached queries in tagged cache - if ($isTaggableStore) { + if ($isTaggableStore && Cache::tags($modelClasses) instanceof RedisTaggedCache) { Cache::tags($modelClasses)->flushStale(); } - + //If cached, return if (($isTaggableStore && Cache::tags($modelClasses)->has($cacheKey)) || Cache::has($cacheKey)) { $this->log("Found cache entry for '{$cacheKey}'");