namelesscoder / typo3-cms-multilevel-cache
Requires
- typo3/cms-core: ^7.6|^8|^9|^10|dev-master
Replaces
- multilevel_cache: 1.2.0
README
这是一个小巧的TYPO3扩展,仅做一件事
添加一个新缓存后端,该后端将委托给多个优先级排序的缓存后端
这是什么意思?
这基本上意味着您可以组合和优先使用多个缓存后端来为TYPO3缓存服务。主要用例是结合瞬态内存后端和持久化后端;这使得TYPO3仅在绝对必要时才查询“慢速”缓存,而不是每次都从持久/慢速存储中检索变量。
您也可以以其他方式组合缓存
- 在Redis查找后执行本地SQL
- 在本地SQL和Redis查找后使用Memcached
- 在文件和本地SQL查找后使用瞬态内存
- 等等,使用任何可用的后端
目标受众
此扩展的主要目标受众是 使用任何类型远程存储缓存的网站,希望减少重复缓存请求的延迟。如果您的网站使用本地数据库存储,您可能不会从安装和使用此扩展中获得任何好处。
哲学很简单:任何可以避免的远程数据库或其他服务器上的缓存请求都应避免。对同一缓存资源的多个请求应始终从内存中返回资源以减少延迟。
安装
仅通过Packagist提供
composer require namelesscoder/typo3-cms-multilevel-cache
根据您的设置,您可能需要在之后通过TYPO3扩展管理器激活扩展。
配置
配置多级缓存后端只有一种方式:通过更改全局TYPO3配置中存在的缓存配置。这意味着您必须将配置放在以下两个可能的地点之一
- 扩展的
ext_localconf.php
(如果您尚未使用它,建议使用“站点扩展”模式!) - 您的TYPO3网站的
AdditionalConfiguration.php
在这两个地方,您可以按照以下方式将现有缓存转换为多级后端
// Simplest, most frequent use case: put runtime cache on top of existing cache \NamelessCoder\MultilevelCache\CacheConfiguration::convert( 'extbase_object', 'cache_runtime', // First priority. A string means this is a reference to another cache that's already defined. 'extbase_object' // Second priority. A fast way to operate this is to reference the original configuration. ); // Bit more complex, manually define the second, third, fourth and so on backends that will be used: \NamelessCoder\MultilevelCache\CacheConfiguration::convert( 'extbase_object', 'cache_runtime', // First priority. A string means this is a reference to another cache that's already defined. [ 'backend' => \TYPO3\CMS\Core\Cache\Backend\Typo3DatabaseBackend::class, 'options' => [ 'defaultLifetime' => 0, ] ] );
请注意,原始缓存(在本例中为 extbase_object
)必须定义。通过上述API无法配置缓存前端,因此必须手动配置。
最后一个示例显示了添加到“选项”数组中的不同配置选项,以配置组合后端的行为
\NamelessCoder\MultilevelCache\CacheConfiguration::convert( 'extbase_object', 'cache_runtime', // First priority. A string means this is a reference to another cache that's already defined. [ 'backend' => \TYPO3\CMS\Core\Cache\Backend\Typo3DatabaseBackend::class, 'options' => [ 'defaultLifetime' => 86400 ], 'multilevel' => [ 'flush => true, // Flush this backend when the cache is flushed. Default `true`. 'cascade' => true, // Do `set()` and `remove()` also on this backend. Default `true`. 'prefix' => 'combo-extbase-object', // All items' IDs are prefixed with this value. Default is empty. ] ], [ 'backend' => My\Extension\OffSiteCacheBackend::class, 'options' => [ 'defaultLifetime' => 604800 ], 'multilevel' => [ 'flush => false ] ] );
最后,cache_runtime
缓存会自动配置flush = true
,cascade = true
以及一个包含原始缓存标识符的自动前缀,以避免任何潜在冲突。这样做是为了在组合配置中更容易引用此特定缓存,因为这是最常见的情况,并且期望的行为正好是将来自低优先级缓存后端返回的任何内容存储在运行时缓存中。
请注意,这使运行时缓存与其他缓存不同
- 当与其他缓存组合时,此缓存将自动刷新。
- 缓存条目有一个标识符,与低级缓存不同(前缀)
自动前缀默认为你要替换的缓存名称。这意味着,如果你在缓存 mycache_special
中存储了ID为 foobar-value
的内容,并且将该缓存转换为多层缓存,则最顶层运行时缓存层中的缓存ID变为 mycache_special_foobar-value
。 这将在透明中完成,你无需传递缓存ID的前缀 - 只有在某种原因下你想要直接从运行时缓存中访问多层缓存值,而不是从 MultilevelCacheBackend 访问时,这才会对你产生影响。
一些提示
在使用此扩展之前,你应该了解以下内容
- 当你定义组合缓存后端时,不支持标签的后端将简单地忽略标签。
- 这也意味着,当按标签刷新时,组合集中非标签支持的后端将被完全刷新。
- 执行刷新操作时,所有后端都会被刷新。
- 当你使用远程缓存(如Redis)时,请小心使用。如果你的从服务器共享缓存,批量刷新可能会导致负载峰值 - 这在远程缓存中是正常的,但在同时刷新多个缓存时更为重要。
- 所有组合配置的缓存中的缓存标识符都将相同。为了避免这种情况,请使用上面显示的
prefix
选项。
致谢
本工作的部分由 LINKS DER ISAR GmbH 赞助 - http://www.linksderisar.com/