缓存组件

缓存组件

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

提示

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

安装

1
作曲家需要symfony /缓存欧宝娱乐app下载地址

请注意

如果在Symfony应用程序之外安装此组件,则必须使用欧宝娱乐app下载地址供应商/ autoload.php以启用Composer提供的类自动加载机制。读这篇文章为更多的细节。

缓存契约vs PSR-6

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

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

提示

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

缓存的合同

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

首先需要实例化一个缓存适配器。的欧宝娱乐app下载地址Symfony \适配器组件缓存\ \ \ FilesystemAdapter在这个例子中使用:

使用欧宝娱乐app下载地址Symfony \适配器组件缓存\ \ \ FilesystemAdapter美元的缓存FilesystemAdapter();

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

使用欧宝娱乐app下载地址Symfony \ \缓存\ ItemInterface合同//调用对象只会在缓存失败时被执行。美元的价值美元的缓存->得到“my_cache_key”函数ItemInterface美元的项目美元的项目->expiresAfter3600);/ /……做一些HTTP请求或繁重的计算computedValue美元“foobar”返回computedValue美元});回声美元的价值/ /“foobar”/ /……并移除缓存键美元的缓存->删除“my_cache_key”);

请注意

使用缓存标签一次删除多个键。阅读更多缓存失效

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

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

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

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

使用欧宝娱乐app下载地址Symfony \ \缓存\ ItemInterface合同美元β1.0美元的价值美元的缓存->得到“my_cache_key”函数ItemInterface美元的项目美元的项目->expiresAfter3600);美元的项目->标签([“tag_0”“tag_1”]);返回“……”},美元β);

通用缓存(PSR-6)

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

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

基本用法(PSR-6)

组件的这一部分是PSR-6,这意味着其基本API与文档中定义的相同。在开始缓存信息之前,使用任何内置适配器创建缓存池。例如,要创建基于文件系统的缓存,请实例化欧宝娱乐app下载地址Symfony \适配器组件缓存\ \ \ FilesystemAdapter

使用欧宝娱乐app下载地址Symfony \适配器组件缓存\ \ \ FilesystemAdapter美元的缓存FilesystemAdapter();

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

//创建一个新项目,尝试从缓存中获取它productsCount美元美元的缓存->getItem“stats.products_count”);//赋值给项目并保存它productsCount美元->4711);美元的缓存->保存productsCount美元);//获取缓存项productsCount美元美元的缓存->getItem“stats.products_count”);如果productsCount美元->isHit())/ /……项在缓存中不存在//获取项存储的值总美元productsCount美元->得到();//删除缓存项美元的缓存->deleteItem“stats.products_count”);

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

编组(序列化)数据

请注意

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

解组一个对象将产生原始对象的一个副本,可能通过自动加载对象的类定义来实现。

欧宝娱乐app下载地址Symfony使用信号员(类的实现欧宝娱乐app下载地址Symfony \ \ \ Marshaller \ MarshallerInterface缓存组件),以便在存储缓存项之前处理它们。

欧宝娱乐app下载地址Symfony \ \ \ Marshaller \ DefaultMarshaller缓存组件使用PHP的serialize ()igbinary_serialize ()如果Igbinary扩展安装。还有其他的信号员可以在存储数据之前加密或压缩数据的:

使用欧宝娱乐app下载地址Symfony \适配器组件缓存\ \ \ RedisAdapter使用欧宝娱乐app下载地址Symfony \组件\ \ DefaultMarshaller缓存使用欧宝娱乐app下载地址Symfony \组件\ \ DeflateMarshaller缓存marshaller美元DeflateMarshallerDefaultMarshaller());美元的缓存RedisAdapter\复述,(),“名称”0marshaller美元);

这项工作,包括代码样本,是在一个创作共用BY-SA 3.0许可证。