From 76c75b8719cd57e0625626a287cfa422e8660290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20H=C3=B8gh?= Date: Fri, 7 Jun 2024 12:16:56 +0200 Subject: [PATCH 1/6] Refactor Redis driver to read all keys efficiently The Redis driver's function to read all keys has been streamlined. The changes include removing the check for iterable and adding a loop to scan and merge the keys iteratively. This ensures that the function will work correctly, even when the number of keys retrieved exceeds the MAX_ALL_KEYS_COUNT. --- lib/Phpfastcache/Drivers/Redis/Driver.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/Phpfastcache/Drivers/Redis/Driver.php b/lib/Phpfastcache/Drivers/Redis/Driver.php index 49d5e21f..5c170a2e 100644 --- a/lib/Phpfastcache/Drivers/Redis/Driver.php +++ b/lib/Phpfastcache/Drivers/Redis/Driver.php @@ -125,13 +125,16 @@ protected function driverConnect(): bool */ protected function driverReadAllKeys(string $pattern = '*'): iterable { - $i = -1; - $keys = $this->instance->scan($i, $pattern === '' ? '*' : $pattern, ExtendedCacheItemPoolInterface::MAX_ALL_KEYS_COUNT); - if (is_iterable($keys)) { - return $keys; - } else { - return []; - } + $i = null; + $keys = []; + $pattern = $pattern === '' ? '*' : $pattern; + do { + $keys = array_merge($keys, $this->instance->scan($i, $pattern)); + if (sizeof($keys) > ExtendedCacheItemPoolInterface::MAX_ALL_KEYS_COUNT) { + break; + } + } while ($i > 0); + return $keys; } /** From 1e7582bb532a2d9f9bf4a26bc54cccc9c48afff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20H=C3=B8gh?= Date: Tue, 17 Sep 2024 21:31:33 +0200 Subject: [PATCH 2/6] Also rewrite of method driverReadAllKeys in Rediscluster driver. --- lib/Phpfastcache/Drivers/Redis/Driver.php | 7 ++--- .../Drivers/Rediscluster/Driver.php | 30 ++++++++++--------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/lib/Phpfastcache/Drivers/Redis/Driver.php b/lib/Phpfastcache/Drivers/Redis/Driver.php index 5c170a2e..8a24d311 100644 --- a/lib/Phpfastcache/Drivers/Redis/Driver.php +++ b/lib/Phpfastcache/Drivers/Redis/Driver.php @@ -126,15 +126,14 @@ protected function driverConnect(): bool protected function driverReadAllKeys(string $pattern = '*'): iterable { $i = null; - $keys = []; $pattern = $pattern === '' ? '*' : $pattern; do { - $keys = array_merge($keys, $this->instance->scan($i, $pattern)); - if (sizeof($keys) > ExtendedCacheItemPoolInterface::MAX_ALL_KEYS_COUNT) { + $keys[] = $this->instance->scan($i, $pattern); + if (\count($keys) > ExtendedCacheItemPoolInterface::MAX_ALL_KEYS_COUNT) { break; } } while ($i > 0); - return $keys; + return \array_merge([], ...$keys); } /** diff --git a/lib/Phpfastcache/Drivers/Rediscluster/Driver.php b/lib/Phpfastcache/Drivers/Rediscluster/Driver.php index 54b8afb0..39397a39 100644 --- a/lib/Phpfastcache/Drivers/Rediscluster/Driver.php +++ b/lib/Phpfastcache/Drivers/Rediscluster/Driver.php @@ -62,7 +62,8 @@ public function getStats(): DriverStatistic trim(<<instance->_masters() as $master) { - $i = -1; - $result = $this->instance->scan( - $i, - $master, - $pattern === '' ? '*' : $pattern, - ExtendedCacheItemPoolInterface::MAX_ALL_KEYS_COUNT - ); - if (is_array($result)) { - $keys[] = $result; - } + $i = null; + $pattern = $pattern === '' ? '*' : $pattern; + do { + $result[] = $this->instance->scan( + $i, + $master, + $pattern, + 10); + if (\count($result) > ExtendedCacheItemPoolInterface::MAX_ALL_KEYS_COUNT) { + break; + } + } while ($i > 0); } - - return array_unique(array_merge(...$keys)); + return array_unique(\array_merge(...$result)); } /** From ab51ff9a089f7154e580f0a2b0585262d5ef494b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20H=C3=B8gh?= Date: Wed, 29 Jan 2025 15:06:50 +0100 Subject: [PATCH 3/6] Set initial value of loop variable to zero in RedisCluster driver. --- lib/Phpfastcache/Drivers/Rediscluster/Driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Phpfastcache/Drivers/Rediscluster/Driver.php b/lib/Phpfastcache/Drivers/Rediscluster/Driver.php index 39397a39..4f34aead 100644 --- a/lib/Phpfastcache/Drivers/Rediscluster/Driver.php +++ b/lib/Phpfastcache/Drivers/Rediscluster/Driver.php @@ -126,7 +126,7 @@ protected function driverReadAllKeys(string $pattern = '*'): iterable { $result = [[]]; foreach ($this->instance->_masters() as $master) { - $i = null; + $i = 0; $pattern = $pattern === '' ? '*' : $pattern; do { $result[] = $this->instance->scan( From ddb671b77339a5ceb5d5893d776ad205c5b27501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20H=C3=B8gh?= Date: Wed, 29 Jan 2025 15:07:37 +0100 Subject: [PATCH 4/6] Update test workflow to be fixed on ubuntu-22.04 --- .github/workflows/testsv2.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testsv2.yml b/.github/workflows/testsv2.yml index 98679d44..103fff81 100644 --- a/.github/workflows/testsv2.yml +++ b/.github/workflows/testsv2.yml @@ -7,7 +7,7 @@ jobs: timeout-minutes: 60 strategy: matrix: - operating-system: [ubuntu-latest] + operating-system: [ubuntu-22.04] php-versions: ['8.0', '8.1', '8.2', '8.3'] name: PHP ${{ matrix.php-versions }} quality/tests on ${{ matrix.operating-system }} env: From 0bc448ee67a718d53267688200c6689b94112780 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20H=C3=B8gh?= Date: Wed, 29 Jan 2025 16:05:44 +0100 Subject: [PATCH 5/6] Multi-line function call not indented correctly --- lib/Phpfastcache/Drivers/Rediscluster/Driver.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/Phpfastcache/Drivers/Rediscluster/Driver.php b/lib/Phpfastcache/Drivers/Rediscluster/Driver.php index 4f34aead..701686b7 100644 --- a/lib/Phpfastcache/Drivers/Rediscluster/Driver.php +++ b/lib/Phpfastcache/Drivers/Rediscluster/Driver.php @@ -129,11 +129,7 @@ protected function driverReadAllKeys(string $pattern = '*'): iterable $i = 0; $pattern = $pattern === '' ? '*' : $pattern; do { - $result[] = $this->instance->scan( - $i, - $master, - $pattern, - 10); + $result[] = $this->instance->scan($i, $master, $pattern, 10); if (\count($result) > ExtendedCacheItemPoolInterface::MAX_ALL_KEYS_COUNT) { break; } From bcbf5b804fdde2abeabc0f07cf334def36ce03e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20H=C3=B8gh?= Date: Thu, 30 Jan 2025 11:56:31 +0100 Subject: [PATCH 6/6] Count of keys per iteration is set to default --- lib/Phpfastcache/Drivers/Rediscluster/Driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Phpfastcache/Drivers/Rediscluster/Driver.php b/lib/Phpfastcache/Drivers/Rediscluster/Driver.php index 701686b7..d791201c 100644 --- a/lib/Phpfastcache/Drivers/Rediscluster/Driver.php +++ b/lib/Phpfastcache/Drivers/Rediscluster/Driver.php @@ -129,7 +129,7 @@ protected function driverReadAllKeys(string $pattern = '*'): iterable $i = 0; $pattern = $pattern === '' ? '*' : $pattern; do { - $result[] = $this->instance->scan($i, $master, $pattern, 10); + $result[] = $this->instance->scan($i, $master, $pattern); if (\count($result) > ExtendedCacheItemPoolInterface::MAX_ALL_KEYS_COUNT) { break; }