使用带有Memcached驱动程序的PhpFastCache向缓存项添加标记需要很长时间

使用带有Memcached驱动程序的PhpFastCache向缓存项添加标记需要很长时间,php,caching,memcached,phpfastcache,Php,Caching,Memcached,Phpfastcache,代码如下: public static function applyInvalidationTags(ExtendedCacheItemInterface $cacheItem, $values): void { $isSomething = false; $tags = []; foreach ($values[0] as $value) { $tags[] = 'product_id_' . $value

代码如下:

    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。

您的缓存中到底有多少产品? 标签应该以“一对一”的方式使用,而不是以“多对一”的方式使用,这可以解释为什么您会面临性能问题


此外,如果您使用的是“基于磁盘”的驱动程序,它的效率将远远低于基于内存的驱动程序,如Redis(和其他驱动程序),因为I/O活动会破坏应用程序的性能。

经过调查后,问题是我有太多具有相同“搜索”标记的缓存条目(如上万条条目)

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


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

即使刷新缓存,我也会遇到这个问题。它尝试添加18个产品,这意味着我有21个。标签是18个产品ID、“isSomething”、“search”和“query”。我使用的是基于内存的驱动程序(memcached)。不过,您使用redis作为驱动程序是正确的,因为我没有这个问题。我试图推动实现一个redis缓存解决方案,但我的领导不想,他认为安装和配置起来比较困难。我不同意他的评价,但我没有让他安装redis。我正在用我放在那里的信息更新这个问题。在这种情况下,这可能是一个低性能的后端问题,标记有点CPU贪婪,但没有什么特别的。