Skip to content

Commit 8f54e93

Browse files
authored
[3.0] 修复Cache前缀选项与setMultiple不兼容问题 (#688)
* Update: 修复`Cache`前缀选项与`setMultiple`不兼容问题 * Update: 优化实现 * Update: 优化实现 * Update: 优化实现
1 parent 26657dd commit 8f54e93

File tree

2 files changed

+53
-9
lines changed

2 files changed

+53
-9
lines changed

src/Cache/Handler/Redis.php

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,23 +77,26 @@ public function clear(): bool
7777
*/
7878
public function getMultiple(iterable $keys, mixed $default = null): iterable
7979
{
80-
foreach ($keys as &$key)
80+
$newKeys = [];
81+
$parsedKeys = [];
82+
foreach ($keys as $key)
8183
{
82-
$key = $this->parseKey($key);
84+
$parsedKeys[] = $this->parseKey($key);
85+
$newKeys[] = $key;
8386
}
84-
$mgetResult = ImiRedis::use(static fn (\Imi\Redis\RedisHandler $redis) => $redis->mget($keys), $this->poolName, true);
87+
$mgetResult = ImiRedis::use(static fn (\Imi\Redis\RedisHandler $redis) => $redis->mget($parsedKeys), $this->poolName, true);
8588
$result = [];
8689
if ($mgetResult)
8790
{
8891
foreach ($mgetResult as $i => $v)
8992
{
9093
if (false === $v)
9194
{
92-
$result[$keys[$i]] = $default;
95+
$result[$newKeys[$i]] = $default;
9396
}
9497
else
9598
{
96-
$result[$keys[$i]] = $this->decode($v);
99+
$result[$newKeys[$i]] = $this->decode($v);
97100
}
98101
}
99102
}
@@ -114,21 +117,22 @@ public function setMultiple(iterable $values, null|int|\DateInterval $ttl = null
114117
{
115118
$setValues = $values;
116119
}
120+
$values = [];
117121
foreach ($setValues as $k => $v)
118122
{
119-
$setValues[$this->parseKey((string) $k)] = $this->encode($v);
123+
$values[$this->parseKey((string) $k)] = $this->encode($v);
120124
}
121125
// ttl 支持 \DateInterval 格式
122126
if ($ttl instanceof \DateInterval)
123127
{
124128
$ttl = DateTime::getSecondsByInterval($ttl);
125129
}
126-
$result = ImiRedis::use(static function (\Imi\Redis\RedisHandler $redis) use ($setValues, $ttl) {
130+
$result = ImiRedis::use(static function (\Imi\Redis\RedisHandler $redis) use ($values, $ttl) {
127131
$redis->multi();
128-
$redis->mset($setValues);
132+
$redis->mset($values);
129133
if (null !== $ttl)
130134
{
131-
foreach ($setValues as $k => $v)
135+
foreach ($values as $k => $v)
132136
{
133137
$redis->expire((string) $k, $ttl);
134138
}

tests/unit/Component/Tests/CacheRedisTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,50 @@
44

55
namespace Imi\Test\Component\Tests;
66

7+
use Imi\Bean\BeanFactory;
8+
use Imi\Cache\Handler\Redis;
9+
use PHPUnit\Framework\Assert;
10+
711
/**
812
* @testdox Cache Redis Handler
913
*/
1014
class CacheRedisTest extends BaseCacheTestCase
1115
{
1216
protected string $cacheName = 'redis';
17+
18+
public function testMultipleWithPrefix(): void
19+
{
20+
$cache = BeanFactory::newInstance(Redis::class, [
21+
'poolName' => 'redis_test',
22+
'prefix' => 'imi-test:',
23+
'formatHandlerClass' => \Imi\Util\Format\Json::class,
24+
]);
25+
26+
$value = bin2hex(random_bytes(8));
27+
$values = [
28+
'k1' => 'v1' . $value,
29+
'k2' => 'v2' . $value,
30+
'k3' => 'v3' . $value,
31+
];
32+
Assert::assertTrue($cache->setMultiple($values));
33+
$getValues = $cache->getMultiple([0 => 'k1', 2 => 'k2', 'A' => 'k3']);
34+
Assert::assertEquals($values, $getValues);
35+
36+
$this->go(static function () use ($cache): void {
37+
$value = bin2hex(random_bytes(8));
38+
39+
$values = [
40+
'k1' => 'v1' . $value,
41+
'k2' => 'v2' . $value,
42+
];
43+
Assert::assertTrue($cache->setMultiple($values, 1));
44+
$getValues = $cache->getMultiple(array_keys_string($values));
45+
Assert::assertEquals($values, $getValues);
46+
sleep(2);
47+
Assert::assertEquals([
48+
'k1' => 'none',
49+
'k2' => 'none',
50+
], $cache->getMultiple(array_keys_string($values), 'none'));
51+
}, null, 3);
52+
}
1353
}

0 commit comments

Comments
 (0)