Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9763ed0

Browse files
committed
[Cache] Optimize caching of tags
1 parent 674ad07 commit 9763ed0

File tree

2 files changed

+29
-24
lines changed

2 files changed

+29
-24
lines changed

src/Symfony/Component/Cache/Adapter/TagAwareAdapter.php

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,7 @@ static function (array $items, array $itemTags) {
7979
);
8080
self::$setTagVersions ??= \Closure::bind(
8181
static function (array $items, array $tagVersions) {
82-
$now = null;
83-
foreach ($items as $key => $item) {
82+
foreach ($items as $item) {
8483
$item->newMetadata[CacheItem::METADATA_TAGS] = array_intersect_key($tagVersions, $item->newMetadata[CacheItem::METADATA_TAGS] ?? []);
8584
}
8685
},
@@ -343,14 +342,16 @@ public function __destruct()
343342
private function getTagVersions(array $tagsByKey, bool $persistTags): array
344343
{
345344
$tagVersions = [];
346-
$fetchTagVersions = false;
345+
$fetchTagVersions = $persistTags;
347346

348347
foreach ($tagsByKey as $tags) {
349348
$tagVersions += $tags;
350-
349+
if ($fetchTagVersions) {
350+
continue;
351+
}
351352
foreach ($tags as $tag => $version) {
352353
if ($tagVersions[$tag] !== $version) {
353-
unset($this->knownTagVersions[$tag]);
354+
$fetchTagVersions = true;
354355
}
355356
}
356357
}
@@ -364,38 +365,39 @@ private function getTagVersions(array $tagsByKey, bool $persistTags): array
364365
foreach ($tagVersions as $tag => $version) {
365366
$tags[$tag.static::TAGS_PREFIX] = $tag;
366367
$knownTagVersion = $this->knownTagVersions[$tag] ?? [0, null];
367-
if ($fetchTagVersions || $knownTagVersion[1] !== $version || $now - $knownTagVersion[0] >= $this->knownTagVersionsTtl) {
368-
// reuse previously fetched tag versions up to the ttl
369-
$fetchTagVersions = true;
370-
}
371368
unset($this->knownTagVersions[$tag]); // For LRU tracking
372-
if ([0, null] !== $knownTagVersion) {
373-
$this->knownTagVersions[$tag] = $knownTagVersion;
369+
if ($fetchTagVersions || $knownTagVersion[1] !== $version || $now > $knownTagVersion[0]) {
370+
// reuse previously fetched tag versions until the expiration
371+
$fetchTagVersions = true;
372+
continue;
374373
}
374+
$this->knownTagVersions[$tag] = $knownTagVersion;
375375
}
376376

377377
if (!$fetchTagVersions) {
378378
return $tagVersions;
379379
}
380380

381+
if (\count($this->knownTagVersions) > self::MAX_NUMBER_OF_KNOWN_TAG_VERSIONS) {
382+
array_splice($this->knownTagVersions, 0, \count($this->knownTagVersions) >> 1);
383+
}
384+
381385
$newTags = [];
382386
$newVersion = null;
387+
$expiration = $now + $this->knownTagVersionsTtl;
383388
foreach ($this->tags->getItems(array_keys($tags)) as $tag => $version) {
384-
if (!$version->isHit()) {
389+
if ($persistTags && !$version->isHit()) {
385390
$newTags[$tag] = $version->set($newVersion ??= random_bytes(6));
386391
}
387-
$tagVersions[$tag = $tags[$tag]] = $version->get();
388-
$this->knownTagVersions[$tag] = [$now, $tagVersions[$tag]];
392+
if ($tagVersions[$tag = $tags[$tag]] = $version->get()) {
393+
$this->knownTagVersions[$tag] = [$expiration, $tagVersions[$tag]];
394+
}
389395
}
390396

391-
if ($newTags && $persistTags) {
397+
if ($newTags) {
392398
(self::$saveTags)($this->tags, $newTags);
393399
}
394400

395-
if (\count($this->knownTagVersions) > $maxTags = max(self::MAX_NUMBER_OF_KNOWN_TAG_VERSIONS, \count($newTags) << 1)) {
396-
array_splice($this->knownTagVersions, 0, $maxTags >> 1);
397-
}
398-
399401
return $tagVersions;
400402
}
401403
}

src/Symfony/Component/Cache/Tests/Adapter/TagAwareAdapterTest.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,18 @@ public function testKnownTagVersionsTtl()
6767

6868
$pool->save($item);
6969
$this->assertTrue($pool->getItem('foo')->isHit());
70-
$this->assertTrue($pool->getItem('foo')->isHit());
7170

72-
sleep(20);
71+
$tagsPool->deleteItem('baz'.TagAwareAdapter::TAGS_PREFIX); // tag invalidation
7372

74-
$this->assertTrue($pool->getItem('foo')->isHit());
73+
$this->assertTrue($pool->getItem('foo')->isHit()); // known tag version is used
7574

76-
sleep(5);
75+
sleep(10);
7776

78-
$this->assertTrue($pool->getItem('foo')->isHit());
77+
$this->assertTrue($pool->getItem('foo')->isHit()); // known tag version is still used
78+
79+
sleep(1);
80+
81+
$this->assertFalse($pool->getItem('foo')->isHit()); // known tag version has expired
7982
}
8083

8184
public function testInvalidateTagsWithArrayAdapter()

0 commit comments

Comments
 (0)