webandco/neos-asset-usage-cache

此包的最新版本(0.2)没有可用的许可信息。

提高资产使用查询性能

安装次数: 1,629

依赖者: 0

建议者: 1

安全: 0

星星: 0

观察者: 3

分支: 1

公开问题: 0

类型:neos-package

0.2 2023-04-03 14:19 UTC

This package is auto-updated.

Last update: 2024-09-03 17:32:05 UTC


README

该包提供了一种缓存资产使用结果的策略。此外,获取相关节点的数据库查询被简化,也可以由数据库服务器进行缓存。

安装

使用composer安装此包。建议仅在开发环境中使用此包。

composer require webandco/neos-asset-usage-cache

特性

此包提供各种特性来提高查询资产使用的性能。

替代包 https://github.com/punktDe/elastic-assetusageinnodes 也通过使用elasticsearch索引来解决性能问题。与elasticsearch包的主要区别是

  1. 此包,webandco/neos-asset-usage-cache,只需要NEOS使用的数据库。无需使用elasticsearch。
  2. 我们假设缓存的生命周期较短,而elasticsearch包基本上是节点的索引,并根据需要进行更新。
  3. 我们还使用不同的方法来注入我们自己的AssetUsageStrategy。然后,您可以通过Settings.yaml禁用/启用策略,从而更灵活地进行操作并创建/扩展您自己的AssetUsageStrategy - 这在NEOS中默认情况下更为复杂。
  4. 如果您想完全禁用缓存,可以在Settings.yaml中这样做,并故意启用它,例如在您的长时间运行命令控制器中。
  5. 您还可以禁用缓存本身,并让数据库缓存结果。这基本上意味着修改了确定资产使用的查询。这种方法可能非常快,并且始终提供正确的结果。缺点是您需要重新配置数据库以增加查询缓存,这可能会因为内部DB锁定而降低查询性能。更多详细信息见下方链接。

可配置的资产使用策略

目前,资产使用是通过遍历实现Neos\Media\Domain\Strategy\AssetUsageStrategyInterface的所有类并汇总或合并实现的结果来生成的。

在默认设置中,无法启用/禁用策略,这使得替换当前的默认策略Neos\Neos\Domain\Strategy\AssetUsageInNodePropertiesStrategy变得复杂。

此包使用一个方面Neos\Media\Domain\Service\AssetService->getUsageStrategies()和配置来禁用或启用策略。因此,可以更容易地添加或删除AssetUsageStrategy。

简化的数据库查询

AssetUsageInNodePropertiesStrategy中的默认资产使用查询为属性列添加多个LIKE条件,以查询节点数据表。

资产使用得越多,图像变体就越多,添加的LIKE条件就越多,这会使查询变慢。

在此包中,我们实现了一种替代方法,即只查询包含__identifierasset:的所有行,然后使用PHP的preg_match_all过滤结果。因此,工作负载从数据库转移到PHP。

为了利用数据库查询缓存,您可能需要增加查询缓存大小,例如。

SET GLOBAL query_cache_size = 500*1024*1024;
SET GLOBAL query_cache_limit = 200*1024*1024;

请注意,通过增加数据库缓存大小,数据库实际上可能会变慢,请参阅https://dev.mysqlserver.cn/doc/refman/5.6/en/query-cache.html

Be cautious about sizing the query cache excessively large,
which increases the overhead required to maintain the cache,
possibly beyond the benefit of enabling it.
Sizes in tens of megabytes are usually beneficial.
Sizes in the hundreds of megabytes might not be. 

有关更多详情,请参阅: https://haydenjames.io/mysql-query-cache-size-performance/

如果您增加数据库查询缓存大小,本包中使用的查询将被缓存,无需PHP缓存。

缓存资产使用

数据库结果通过缓存管理,当节点发生变化时通过信号更新,默认每小时刷新一次。

性能

本包中使用的数据库查询,对于nodeData表中的大约300,000个节点,大约需要4秒钟。节点越多,此查询越慢。

此数据库查询与任何特定资产或使用计数无关,对每个资产执行相同。

如果缓存已填充,AssetUsageCacheStrategy提供的方法每个资产大约需要6毫秒,几乎不受使用计数的影响。

配置

默认配置禁用AssetUsageInNodePropertiesStrategy并启用提供的AssetUsageCacheStrategy

此外,启用查询缓存并启用realTimeUpdate

Webandco:
  AssetUsageCache:
    assetUsageStrategies:
      AssetUsageInNodePropertiesStrategy:
        className: 'Neos\Neos\Domain\Strategy\AssetUsageInNodePropertiesStrategy'
        disable: true
      AssetUsageCacheStrategy:
        className: 'Webandco\AssetUsageCache\Domain\Strategy\AssetUsageCacheStrategy'
        disable: false
    queryCache:
      disable: false
      realTimeUpdate: true

用例

仅数据库查询缓存

要使用数据库查询缓存但不使用PHP缓存,只需在配置中禁用缓存即可

Webandco:
  AssetUsageCache:
    queryCache:
      disable: true

有意启用缓存

如果缓存不应在媒体浏览器中使用,但在自定义命令行操作期间使用,则需要通过配置禁用缓存,见上文。

然后在命令行操作中您可以启用缓存


    /**
     * @Flow\Inject
     * @var AssetCacheService
     */
    protected $assetCacheService;

....

    public function reConfigureAssetCache(){
        $this->assetCacheService->setRealTimeUpdate(false);
        $this->assetCacheService->setCacheDisabled(false);
        // eventually just flush the cache - globally
        $this->assetCacheService->flush();
    }

因此,缓存将在当前命令行操作的运行期间使用,这对于需要迭代所有资产并检查其使用计数很有用。