缓存池

编辑本页

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

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

缓存池

缓存池是缓存项的逻辑存储库。它们执行项目上的所有常见操作,例如保存或查找项目。缓存池独立于实际的缓存实现。因此,即使底层缓存机制从基于文件系统的缓存变为基于Redis或数据库的缓存,应用程序也可以继续使用相同的缓存池。

创建缓存池

缓存池是通过缓存适配器,它们是实现的类AdapterInterface.该组件提供了几个可以在应用程序中使用的适配器。

阵列缓存适配器

此适配器仅用于测试目的,因为内容存储在内存中,而不是以任何方式持久化。此外,后面解释的一些功能是不可用的,比如延迟保存:

1 2 3 4 5 6 7 8 9
使用欧宝娱乐app下载地址组件缓存适配器ArrayAdapter缓存ArrayAdapter (//秒;应用于未定义自身生存期的缓存项// 0表示无限地存储缓存项(即直到当前PHP进程结束)defaultLifetime0//如果' ' true ' ',保存在缓存中的值在存储之前会被序列化storeSerialized真正的);

文件系统高速缓存适配器

当你想要提高应用程序的性能,但又不能在服务器上安装APC或Redis之类的工具时,这个适配器非常有用。这个适配器将内容作为常规文件存储在本地文件系统的一组目录中:

12 3 4 5 6 7 8 9 10 11 12
使用欧宝娱乐app下载地址组件缓存适配器FilesystemAdapter缓存FilesystemAdapter (//存放缓存项的主缓存目录的子目录名称空间//秒;应用于未定义自身生存期的缓存项// 0表示无限期地存储缓存项(即直到文件被删除)defaultLifetime0//主缓存目录(应用程序需要对其具有读写权限)如果没有指定,则在系统临时目录中创建一个目录目录);

APCu缓存适配器

这个适配器可以显著提高应用程序性能,因为内容缓存在服务器的共享内存中,这比文件系统快得多。它需要安装并启用PHP APCu扩展。不建议在执行大量写入和删除操作时使用它,因为它会在APCu内存中产生碎片,这会显著降低性能:

12 3 4 5 6 7 8 9 10 11 12
使用欧宝娱乐app下载地址组件缓存适配器ApcuAdapter缓存ApcuAdapter (//存储在这个缓存中的项的键前缀字符串名称空间//秒;应用于未定义自身生存期的缓存项// 0表示无限期地存储缓存项(即直到APC内存被删除)defaultLifetime0//如果存在,则将此字符串添加到命名空间以简化//整个缓存失效(例如在部署应用程序时)版本);

Redis缓存适配器

这个适配器将内容存储在服务器的内存中。与APCu适配器不同,它不局限于当前服务器的共享内存,因此您可以在需要时将内容存储在服务器集群中。

它要求已经安装了Redis,并创建了一个连接来实现\复述,\ RedisArray\ RedisCluster\ Predis类:

1 2 3 4 5 6 7 8 9 10 11
使用欧宝娱乐app下载地址组件缓存适配器RedisAdapter缓存RedisAdapter (//存储到Redis系统的有效连接的对象\复述,redisConnection//存储在这个缓存中的项的键前缀字符串名称空间//秒;应用于未定义自身生存期的缓存项// 0表示无限地存储缓存项(即直到Redis内存被删除)defaultLifetime0);

链缓存适配器

该适配器允许组合任何数量的前面的适配器。缓存项从包含它们的第一个适配器获取。此外,缓存项保存在所有给定的适配器中,因此这是创建缓存复制的简单方法:

1 2 3 4 5 6 7 8
使用欧宝娱乐app下载地址组件缓存适配器ApcuAdapter使用欧宝娱乐app下载地址组件缓存适配器ChainAdapter使用欧宝娱乐app下载地址组件缓存适配器FilesystemAdapterapcCacheApcuAdapter ();fileCacheFilesystemAdapter ();缓存ChainAdapter (数组apcCachefileCache));

如果在第一个适配器中没有找到项,但在下一个适配器中找到项,则ChainAdapter确保所获取的项保存在它丢失的所有适配器中。的第二个可选参数,因为不可能知道缓存项的过期日期和时间ChainAdapter默认的生命周期是否应用于这些缓存项(默认为0).

代理缓存适配器

这个适配器对于集成到不是用Symfony cache组件创建的应用程序缓存池中非常有用。欧宝娱乐app下载地址只要这些缓存池实现CacheItemPoolInterface接口,这个适配器允许你从外部缓存中获取项目,并将它们保存在你的应用程序的Symfony缓存中:欧宝娱乐app下载地址

1 2 3 4
使用欧宝娱乐app下载地址组件缓存适配器ProxyAdapter/ /……以某种方式创建$non欧宝娱乐app下载地址SymfonyCache缓存ProxyAdapter (non欧宝娱乐app下载地址SymfonyCache);

适配器接受两个额外的可选参数:命名空间(默认情况下)和默认生命期(0默认情况下)。

此适配器的另一个用例是获取关于缓存命中的统计信息和度量(getHits ())及遗漏(getMisses ()).

教义缓存适配器

这个适配器包装任何教义缓存provider,所以你可以在你的应用程序中使用它们,就像它们是Symfony缓存适配器一样:欧宝娱乐app下载地址

1 2 3 4 5 6
使用学说常见的缓存SQLite3Cache使用欧宝娱乐app下载地址组件缓存适配器DoctrineAdaptersqliteDatabase\ SQLite3 (__DIR__“/缓存/ data.sqlite”);doctrineCacheSQLite3Cache (sqliteDatabase“表”);欧宝娱乐app下载地址symfonyCacheDoctrineAdapter (doctrineCache);

这个适配器还定义了两个可选参数名称空间(默认值:),defaultLifetime(默认值:0),并对它们进行调整,使它们在底层Doctrine缓存中工作。

查找缓存项

缓存池定义了三种方法来查找缓存项。最常见的方法是getItem(键),返回由给定键标识的缓存项:

1 2 3 4
使用欧宝娱乐app下载地址组件缓存适配器FilesystemAdapter缓存FilesystemAdapter (“app.cache”);latest欧宝app在哪里找News缓存->getItem (“latest_欧宝app在哪里找news”);

如果没有为给定键定义项,则该方法不返回值以外的空对象,该对象实现了CacheItem类。

如果需要同时获取多个缓存项,请使用getItems(数组($key1, $key2,…)方法:

1 2
/ /……股票缓存->getItems (数组“apple”“facebook”“GOOGL”“微软”));

同样,如果任何键都不表示有效的缓存项,则不会得到值,但为空CacheItem对象。

与获取缓存项相关的最后一个方法是hasItem(键),返回真正的如果有一个由给定键标识的缓存项:

1 2
/ /……hasBadges缓存->hasItem (“user_”用户标识“_badges”);

保存缓存项

保存缓存项的最常用方法是save (),它立即将项存储在缓存中(它返回真正的是否保存项目或如果发生错误):

1 2 3 4
/ /……userFriends缓存->get (“user_”用户标识“_friends”);userFriends->集(用户->getFriends ());isSaved缓存->保存(userFriends);

有时,为了提高应用程序的性能,您可能倾向于不立即保存对象。在这些情况下,使用saveDeferred ()方法将缓存项标记为“准备持久化”,然后调用commit ()方法,当你准备持久化它们全部时:

1 2 3 4 5 6 7 8
/ /……isQueued缓存->saveDeferred (userFriends);/ /……isQueued缓存->saveDeferred (userPreferences);/ /……isQueued缓存->saveDeferred (userRecentProducts);/ /……isSaved缓存->commit ();

saveDeferred ()方法返回真正的当缓存项已成功添加到“持久队列”和否则。的commit ()方法返回真正的当所有挂起的项都成功保存或否则。

移除缓存项

缓存池包括删除缓存项的方法,其中一部分或全部。最常见的是deleteItem (),它删除由给定键标识的缓存项(它返回真正的当项目被成功删除或不存在时否则):

1 2
/ /……isDeleted缓存->deleteItem (“user_”用户标识);

使用deleteItems ()方法同时删除多个缓存项(它返回真正的只有当所有项都被删除时,即使它们中的任何或部分不存在):

1 2
/ /……areDeleted缓存->deleteItems (数组“category1”“category2”));

最后,要删除池中存储的所有缓存项,请使用clear ()方法(返回真正的当所有项目被成功删除):

1 2
/ /……cacheIsEmpty缓存->明确的();
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。