【问题标题】:Adding tags to cache entry takes a long time using PhpFastCache with Memcached driver使用 PhpFastCache 和 Memcached 驱动程序向缓存条目添加标签需要很长时间
【发布时间】:2020-07-15 13:17:04
【问题描述】:

代码如下:

    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。

【问题讨论】:

    标签: php caching memcached phpfastcache


    【解决方案1】:

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

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

    【讨论】:

    • 即使我刷新缓存也有这个问题。它尝试添加 18 个产品,这意味着我有 21 个。标签是 18 个产品 ID、“isSomething”、“搜索”和“查询”。我正在使用基于内存的驱动程序(memcached)。但是,您使用 redis 作为驱动程序是正确的,因为我没有这个问题。我尝试推动实施 redis 缓存解决方案,但我的领导不想这样做,他认为安装和配置更难。我不同意他的评估,但我没有让他安装 redis。我正在用我放在那里的信息更新这个问题。
    • 在这种情况下,这可能是一个低性能的后端问题,标签有点 CPU 贪婪但没什么特别的。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      相关资源
      最近更新 更多