缓存组件
编辑本页缓存组件
Cache组件提供了涵盖简单到高级缓存需求的特性。它在本地实现PSR-6和缓存的合同最大的互操作性。它是为性能和弹性而设计的,为最常见的缓存后端提供了随时可用的适配器。它通过锁定和提前过期实现基于标记的失效和缓存踩踏保护。
提示
该组件还包含在PSR-6、PSR-16和Doctrine缓存之间进行转换的适配器。看到PSR-6和PSR-16缓存之间的互操作性适配器而且教义缓存适配器.
5.4
对Doctrine Cache的支持在Symfony 5.4中已弃用,它将在Symfonyob娱乐下载 6.0中被移除。
安装
1
$Composer需要symfonyob娱乐下载/cache
请注意
如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php
文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。
缓存的合同
所有适配器都支持缓存契约。它们只包含两个方法:get ()
而且delete ()
.没有设置()
方法,因为get ()
方法同时获取和设置缓存值。
首先需要实例化一个缓存适配器。的FilesystemAdapter在本例中使用:
1 2 3
使用ob娱乐下载\组件\缓存\适配器\FilesystemAdapter;$缓存=新FilesystemAdapter ();
现在可以使用该对象检索和删除缓存数据。的第一个参数get ()
方法是一个键,一个与缓存值关联的任意字符串,以便稍后检索它。第二个参数是一个PHP可调用对象,当在缓存中找不到键时执行,以生成并返回值:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用ob娱乐下载\合同\缓存\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
使用ob娱乐下载\合同\缓存\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
使用ob娱乐下载\组件\缓存\适配器\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”);
有关所有受支持的适配器的列表,请参见缓存池和支持的适配器.
编组(序列化)数据
请注意
编组而且序列化是相似的概念。序列化是将对象状态转换为可以存储的格式(例如在文件中)的过程。编组是将对象状态及其代码库转换为可存储或传输的格式的过程。
解编组对象可以通过自动加载对象的类定义来生成原始对象的副本。
ob娱乐下载Symfony使用信号员(实现的类MarshallerInterface)以处理快缓数据,然后再储存它们。
的DefaultMarshaller使用PHP的serialize ()
或igbinary_serialize ()
如果Igbinary扩展安装。还有其他的信号员可以在存储数据之前加密或压缩数据的:
1 2 3 4 5 6
使用ob娱乐下载\组件\缓存\适配器\RedisAdapter;使用ob娱乐下载\组件\缓存\DefaultMarshaller;使用ob娱乐下载\组件\缓存\DeflateMarshaller;$信号员=新DeflateMarshaller (新DefaultMarshaller ());$缓存=新RedisAdapter (新\复述(),“名称”,0,$信号员);