缓存组件
编辑该页面缓存组件
缓存组件提供的功能包括简单高级高速缓存需求。它实现了PSR-6和缓存的合同为最大的互操作性。它是专为性能和弹性,附带准备为最常见的缓存后端使用适配器。它支持基于失效和缓存蜂拥通过锁定和保护早期失效。
提示
该组件还包含适配器PSR-6和PSR-16之间进行转换。看到适配器PSR-6和PSR-16缓存之间的互操作性。
安装
1
美元作曲家需要symfony /缓存ob娱乐下载
请注意
如果你安装这个组件之外的Symfony应用程序,你必须要求ob娱乐下载供应商/ autoload.php
文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。
缓存的合同
所有适配器支持缓存的合同。他们只包含两个方法:get ()
和delete ()
。没有设置()
方法,因为get ()
获取和设置值缓存方法。
你首先需要的是缓存实例化一个适配器。的FilesystemAdapter本例中使用:
1 2 3
使用ob娱乐下载\组件\缓存\适配器\FilesystemAdapter;美元缓存=新FilesystemAdapter ();
现在您可以使用这个对象检索和删除缓存数据。的第一个参数get ()
是一个关键的方法,一个任意字符串,你联想到缓存的价值,这样你就可以检索。第二个参数是一个PHP调用时执行关键是没有发现在缓存中生成并返回值:
1 2 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 (),这是一个浮动值称为“测试版”。
默认情况下,β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缓存能力,你需要学习它的关键概念:
- 项
- 一个单元的信息存储为一个键/值对,关键是惟一标识符的信息和价值是其内容;看到缓存项文章为更多的细节。
- 池
- 一个逻辑库缓存项。所有缓存操作(储蓄项目,寻找项目,等等)通过执行池。应用程序可以定义需要尽可能多的池。
- 适配器
- 它实现了实际缓存机制来存储文件系统中的信息,在数据库等。该组件提供了几个可以使用适配器通用缓存后端(APCu复述,PDO等。)
基本用法(PSR-6)
这部分的组件的实现PSR-6,这意味着其基本API文档中定义的一样。开始缓存信息之前,创建缓存池使用任何内置的适配器。例如,基于文件系统创建一个缓存,实例化FilesystemAdapter:
1 2 3
使用ob娱乐下载\组件\缓存\适配器\FilesystemAdapter;美元缓存=新FilesystemAdapter ();
现在,您可以创建、检索、更新和删除项目使用这个缓存池:
1 2 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,美元信号员);