缓存池和支持的适配器
编辑本页缓存池和支持的适配器
缓存池是缓存项的逻辑存储库。它们执行项目上的所有常见操作,例如保存或查找项目。缓存池独立于实际的缓存实现。因此,即使底层缓存机制从基于文件系统的缓存变为基于Redis或数据库的缓存,应用程序也可以继续使用相同的缓存池。
创建缓存池
缓存池是通过缓存适配器,它们是实现两者的类CacheInterface而且Psr \ \ CacheItemPoolInterface缓存
.该组件提供了几个可以在应用程序中使用的适配器。
使用缓存契约
的CacheInterface允许抓取,存储和删除缓存项只使用两个方法和一个回调:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用ob娱乐下载\组件\缓存\适配器\FilesystemAdapter;使用ob娱乐下载\合同\缓存\ItemInterface;$缓存=新FilesystemAdapter ();//可调用对象只在缓存丢失时执行。$价值=$缓存->get (“my_cache_key”,函数(ItemInterface$项){$项->expiresAfter (3600);/ /……做一些HTTP请求或繁重的计算$computedValue=“foobar”;返回$computedValue;});回声$价值;/ /“foobar”/ /……并删除缓存键$缓存->删除(“my_cache_key”);
开箱即用,使用此接口通过锁定和提前过期提供踩踏保护。参数的第三个“beta”参数可以控制提前过期get ()方法。看到缓存组件文章获取更多信息。
方法可以在回调函数内部检测提前过期isHit ()方法:如果此返回真正的
,这意味着我们目前正在重新计算一个值在它的到期日期之前。
对于高级用例,回调可以接受第二个bool &美元拯救
通过引用传递的参数。通过设置美元拯救
来假
在回调中,您可以指示缓存池返回的值不应该存储在后端。
使用PSR-6
查找缓存项
缓存池定义了三种方法来查找缓存项。最常见的方法是getItem(键)
,返回由给定键标识的缓存项:
1 2 3 4
使用ob娱乐下载\组件\缓存\适配器\FilesystemAdapter;$缓存=新FilesystemAdapter (“app.cache”);$latest欧宝平台是合法的吗News=$缓存->getItem (“latest_欧宝平台是合法的吗news”);
如果没有为给定键定义项,则该方法不返回零
值以外的空对象,该对象实现了CacheItem类。
如果需要同时获取多个缓存项,请使用getItems([$key1, $key2,…])
方法:
1 2
/ /……$股票=$缓存->getItems ([“apple”,“facebook”,“GOOGL”,“微软”]);
同样,如果任何键都不表示有效的缓存项,则不会得到零
值,但为空CacheItem
对象。
与获取缓存项相关的最后一个方法是hasItem(键)
,返回真正的
如果有一个由给定键标识的缓存项:
1 2
/ /……$hasBadges=$缓存->hasItem (“user_”.$用户标识.“_badges”);
保存缓存项
保存缓存项的最常用方法是Psr \缓存\ CacheItemPoolInterface::保存
,它立即将项存储在缓存中(它返回真正的
是否保存项目或假
如果发生错误):
1 2 3 4
/ /……$userFriends=$缓存->getItem (“user_”.$用户标识.“_friends”);$userFriends->集($用户->getFriends ());$isSaved=$缓存->保存($userFriends);
有时,为了提高应用程序的性能,您可能倾向于不立即保存对象。在这些情况下,使用Psr \缓存\ CacheItemPoolInterface:: saveDeferred
方法将缓存项标记为“准备持久化”,然后调用Psr \缓存\ CacheItemPoolInterface:提交
方法,当你准备持久化它们全部时:
1 2 3 4 5 6 7 8
/ /……$isQueued=$缓存->saveDeferred ($userFriends);/ /……$isQueued=$缓存->saveDeferred ($userPreferences);/ /……$isQueued=$缓存->saveDeferred ($userRecentProducts);/ /……$isSaved=$缓存->commit ();
的saveDeferred ()
方法返回真正的
当缓存项已成功添加到“持久队列”和假
否则。的commit ()
方法返回真正的
当所有挂起的项都成功保存或假
否则。
移除缓存项
缓存池包括删除缓存项的方法,其中一部分或全部。最常见的是Psr \缓存\ CacheItemPoolInterface:: deleteItem
,它删除由给定键标识的缓存项(它返回真正的
当项目被成功删除或不存在时假
否则):
1 2
/ /……$isDeleted=$缓存->deleteItem (“user_”.$用户标识);
使用Psr \缓存\ CacheItemPoolInterface:: deleteItems
方法同时删除多个缓存项(它返回真正的
只有当所有项都被删除时,即使它们中的任何或部分不存在):
1 2
/ /……$areDeleted=$缓存->deleteItems ([“category1”,“category2”]);
最后,要删除池中存储的所有缓存项,请使用Psr \缓存\ CacheItemPoolInterface:清楚
方法(返回真正的
当所有项目被成功删除):
1 2
/ /……$cacheIsEmpty=$缓存->明确的();
提示
如果在Symfony应用程序中使用缓存组件,则可以使用以下命令从缓存池中删除项ob娱乐下载框架包):
删除一个特定的项目从鉴于池:
1 2 3 4
$PHP bin/控制台缓存:pool:delete #从cache中删除cache_key项。应用程序池”$PHP bin/console cache:pool:删除缓存。应用cache_key
你也可以删除所有项目从鉴于池(年代):
1 2 3 4 5 6 7
$PHP bin/console cache:pool:clear . PHP bin/console cache:pool:clear#清除“缓存”。应用程序池”$PHP bin/控制台缓存:清除cache.app#清除“缓存”。验证”和“缓存”。应用程序池”$PHP bin/console cache:pool:清除缓存。验证cache.app
修剪缓存项
有些缓存池不包括自动删除过期缓存项的机制。例如,FilesystemAdapter缓存不会删除过期的缓存项直到显式地请求一个项并确定该项已过期,例如,通过调用Psr \缓存\ CacheItemPoolInterface:: getItem
.在某些工作负载下,这会导致过期的缓存项在过期后仍然存在,从而导致过多的过期缓存项浪费大量的磁盘或内存空间。
这一缺点已经通过引入解决了PruneableInterface,定义了抽象方法删除().的ChainAdapter,FilesystemAdapter,PdoAdapter,PhpFilesAdapter所有这些都实现了这个新接口,允许手动删除过期缓存项:
1 2 3 4 5
使用ob娱乐下载\组件\缓存\适配器\FilesystemAdapter;$缓存=新FilesystemAdapter (“app.cache”);/ /……做一些设置和获取操作$缓存->删除();
的ChainAdapter实现本身不直接包含任何修剪逻辑。相反,当调用链适配器时删除()方法,则将调用委托给其所有兼容的缓存适配器(以及未实现的缓存适配器)PruneableInterface
被默默地忽略):
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用ob娱乐下载\组件\缓存\适配器\ApcuAdapter;使用ob娱乐下载\组件\缓存\适配器\ChainAdapter;使用ob娱乐下载\组件\缓存\适配器\FilesystemAdapter;使用ob娱乐下载\组件\缓存\适配器\PdoAdapter;使用ob娱乐下载\组件\缓存\适配器\PhpFilesAdapter;$缓存=新ChainAdapter ([新ApcuAdapter (),//不实现PruneableInterface新FilesystemAdapter (),//实现PruneableInterface新PdoAdapter (),//实现PruneableInterface新PhpFilesAdapter (),//实现PruneableInterface/ /……]);// prune将代理调用PdoAdapter, FilesystemAdapter和PhpFilesAdapter//当静静地跳过ApcuAdapter时$缓存->删除();