缓存组件

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.2,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

缓存组件

Cache组件提供了涵盖简单到高级缓存需求的特性。它在本地实现PSR-6缓存的合同最大的互操作性。它是为性能和弹性而设计的,为最常见的缓存后端提供了随时可用的适配器。它通过锁定和提前过期实现基于标记的失效和缓存踩踏保护。

提示

该组件还包含在PSR-6、PSR-16和Doctrine缓存之间进行转换的适配器。看到PSR-6和PSR-16缓存之间的互操作性适配器而且教义缓存适配器

安装

1
Composer需要symfony欧宝娱乐app下载地址/cache

请注意

如果在Symfony应用程序外部安装此组件,则必须要求欧宝娱乐app下载地址供应商/ autoload.php文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。

缓存契约与PSR-6

该组件包括两个不同的缓存方法:

PSR-6缓存
一种通用的缓存系统,包括缓存“池”和缓存“项”。
缓存的合同
基于重计算回调来缓存值的更简单但更强大的方法。

提示

建议使用缓存契约方法:它需要更少的代码样板,并在默认情况下提供缓存踩踏保护。

缓存的合同

所有适配器都支持缓存契约。它们只包含两个方法:get ()而且delete ().没有设置()方法,因为get ()方法同时获取和设置缓存值。

首先需要实例化一个缓存适配器。的FilesystemAdapter在本例中使用:

1 2 3
使用欧宝娱乐app下载地址组件缓存适配器FilesystemAdapter缓存FilesystemAdapter ();

现在可以使用该对象检索和删除缓存数据。的第一个参数get ()方法是一个键,一个与缓存值关联的任意字符串,以便稍后检索它。第二个参数是一个PHP可调用对象,当在缓存中找不到键时执行,以生成并返回值:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用欧宝娱乐app下载地址合同缓存ItemInterface//可调用对象只在缓存丢失时执行。价值缓存->get (“my_cache_key”函数(ItemInterface->expiresAfter (3600);/ /……做一些HTTP请求或繁重的计算computedValue“foobar”返回computedValue;});回声价值/ /“foobar”/ /……并删除缓存键缓存->删除(“my_cache_key”);

请注意

使用缓存标记一次删除多个键。欲知详情,请浏览缓存失效

踩踏事故预防

缓存契约也是内置的踩踏事故预防.这将消除缓存处于冷状态时的CPU峰值。如果一个示例应用程序花费5秒来计算缓存1小时的数据,并且该数据每秒被访问10次,这意味着您大部分都有缓存命中,并且一切正常。但是1小时后,我们有10个新请求到冷缓存。所以数据被重新计算。下一秒同样的事情又发生了。因此,在缓存再次升温之前,数据要计算大约50次。这就是你需要预防踩踏的地方。

第一种解决方案是使用锁定:一次只允许一个PHP进程(基于每个主机)计算特定的密钥。默认情况下,锁定是内置的,因此除了利用缓存契约之外,您不需要做任何事情。

第二个解决方案也是在使用缓存契约时内置的:在值到期之前,不是等待完全延迟,而是在到期日期之前重新计算它。的概率提前到期算法随机伪造一个用户的缓存缺失,而其他用户仍然提供缓存值。的第三个可选参数可以控制它的行为get (),这是一个称为“beta”的浮点值。

默认是1.0更高的值意味着更早的重新计算。设置为0禁用早期重新计算并将其设置为强制立即重新计算:

1 2 3 4 5 6 7 8 9
使用欧宝娱乐app下载地址合同缓存ItemInterfaceβ1.0价值缓存->get (“my_cache_key”函数(ItemInterface->expiresAfter (3600);->标签([“tag_0”“tag_1”]);返回'...';},β);

通用高速缓存(PSR-6)

要使用通用的PSR-6缓存能力,你需要学习它的关键概念:

以键/值对存储的单个信息单元,其中键是信息的唯一标识符,值是信息的内容;看到缓存项文章获取更多详细信息。
缓存项的逻辑存储库。所有缓存操作(保存项、查找项等)都是通过池执行的。应用程序可以根据需要定义任意数量的池。
适配器
它实现了实际的缓存机制,将信息存储在文件系统、数据库等中。该组件为常见的缓存后端提供了几个随时可用的适配器(Redis, APCu, Doctrine, PDO等)。

基本用法(PSR-6)

这部分是组件的实现PSR-6,这意味着它的基本API与文档中定义的相同。在开始缓存信息之前,使用任何内置适配器创建缓存池。例如,要创建基于文件系统的缓存,请实例化FilesystemAdapter

1 2 3
使用欧宝娱乐app下载地址组件缓存适配器FilesystemAdapter缓存FilesystemAdapter ();

现在你可以使用这个缓存池创建、检索、更新和删除项目:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
//通过尝试从缓存中获取一个新项来创建一个新项productsCount缓存->getItem (“stats.products_count”);//为项目赋值并保存productsCount->集(4711);缓存->保存(productsCount);//获取缓存项productsCount缓存->getItem (“stats.products_count”);如果(!productsCount->isHit ()) {/ /……项在缓存中不存在//获取项存储的值总计productsCount->get ();//删除缓存项缓存->deleteItem (“stats.products_count”);

有关所有受支持的适配器的列表,请参见缓存池和支持的适配器

编组(序列化)数据

请注意

编组而且序列化是相似的概念。序列化是将对象状态转换为可以存储的格式(例如在文件中)的过程。编组是将对象状态及其代码库转换为可存储或传输的格式的过程。

解编组对象可以通过自动加载对象的类定义来生成原始对象的副本。

欧宝娱乐app下载地址Symfony使用信号员(实现的类MarshallerInterface)以处理快缓数据,然后再储存它们。

DefaultMarshaller使用PHP的serialize ()igbinary_serialize ()如果Igbinary扩展安装。还有其他的信号员可以在存储数据之前加密或压缩数据的:

1 2 3 4 5 6
使用欧宝娱乐app下载地址组件缓存适配器RedisAdapter使用欧宝娱乐app下载地址组件缓存DefaultMarshaller使用欧宝娱乐app下载地址组件缓存DeflateMarshaller信号员DeflateMarshaller (DefaultMarshaller ());缓存RedisAdapter (\复述(),“名称”0信号员);
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。