使用带有 Memcached 驱动程序的 PhpFastCache 将标签添加到缓存条目需要很长时间

Adding tags to cache entry takes a long time using PhpFastCache with Memcached driver

代码如下:

    public static function applyInvalidationTags(ExtendedCacheItemInterface $cacheItem, $values): void
    {
        $isSomething = false;
        $tags = [];
        foreach ($values[0] as $value) {
            $tags[] = 'product_id_' . $value->id;

            if (!$isSomething && $value->isSomething) {
                $tags[] = 'isSomething';
                $isSomething = true;
            }
        }

        $cacheItem->addTags($tags);
    }

当我删除这一行时:'$cacheItem->addTags($tags);'我的请求大约需要 1.6 秒而不是 2.6 秒。 $values[0] 中的对象总是少于 19 个。这意味着缓存条目上最多可以有 20 个标签。

我需要这些标签能够在需要时使缓存失效。否则我将不得不大幅减少缓存时间,从 2 小时缩短到几分钟。

知道为什么放置标签要花这么多时间吗?我该如何改进它?

供参考,当缓存被命中时,我有很好的性能。我正在使用 Memcached 驱动程序,但我尝试改用 Redis,并且在使用它时没有遇到此问题。可悲的是,我的领导不想使用 Redis 而坚持使用 Memcached。

您的缓存中到底有多少产品? 标签应以 "oneToMany" 方式使用,而不是 "manyToOne" 方式,这可以解释为什么您会遇到性能问题。

此外,如果您使用 "disk-based" 驱动程序,它的效率将远低于 Redis(和其他)等基于内存的驱动程序,因为 I/O activity 可以扼杀您应用的性能。

经过调查,问题是我有太多带有相同 'search' 标签的缓存条目(就像成千上万的条目中的十个)。

PhpfastCache 通过为每个标记创建缓存条目来进行标记。然后在缓存条目上添加标签时,它首先检索它,然后修改它并重新发送到 Memcached。所以也有内存问题。

无论如何,我建议使用 Redis 而不是 Memcached,因为我在测试期间遇到的性能问题较少。此外,Redis 是一个更完整的缓存解决方案。