直接运行 composer require symfony/cache 即可安装独立缓存组件,它自动引入 psr-6 和 psr-16 依赖;注意区分两类接口及适配器,redis 需显式复用连接,键名应带命名空间前缀并合理设置 ttl。

直接运行 composer require symfony/cache 就行,别绕弯
这是最简路径,没有前提条件(不需要先装 Symfony 框架,也不依赖 symfony/skeleton)。它就是一个独立组件,纯 PHP 库,装完就能在任何 PHP 项目里用。
- 命令执行后,
vendor/symfony/cache目录会生成,自动注册 PSR-4 自动加载 - 不推荐手动
require psr/cache——symfony/cache已经自动拉取了psr/cache和psr/simple-cache,重复 require 可能引发版本冲突 - 如果报
Could not find package symfony/cache,大概率是 Composer 镜像源被污染或缓存过期:先运行composer clear-cache,再临时切回官方源composer config -g repo.packagist composer https://packagist.org
PSR-6 和 PSR-16 别混用,类型不兼容会 runtime 报错
装完后你面对两个接口体系:Psr\Cache\CacheItemPoolInterface(PSR-6)和 Psr\SimpleCache\CacheInterface(PSR-16),它们不能互相强转,也不能共用同一个类实例。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
FilesystemAdapter、RedisAdapter等返回的是 PSR-6 的CacheItemPoolInterface,不是 PSR-16 - 要用 PSR-16?得选
PhpFilesCache、RedisCache这类带Simple后缀的类:new \Symfony\Component\Cache\Simple\PhpFilesCache() - 错误示例:
$pool = new RedisAdapter($redis); $pool->get('key')——get()是 PSR-16 方法,CacheItemPoolInterface没这个方法,直接 fatal error
Redis Adapter 默认不复用连接,线上高并发必崩
本地跑 RedisAdapter 没问题,一上生产就可能触发 Redis 的 maxclients 拒绝连接,错误信息常是 Connection refused 或 Redis server went away。
- 根本原因:
RedisAdapter默认每次操作都新建一个Predis\Client或Redis实例,不是复用 - 正确做法:显式传入一个已启用持久连接的客户端实例:
$redis = new \Redis(); $redis->pconnect('127.0.0.1', 6379); new RedisAdapter($redis) - 不推荐用
Predis\Client的默认构造方式(如new Predis\Client('tcp://...')),它不开启pconnect;必须显式配置:new Predis\Client(['scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, 'connection_timeout' => 0.5, 'read_write_timeout' => 0.5, 'persistent' => true])
缓存键命名和生命周期设计,比选什么适配器更重要
很多人花时间调 Redis 连接池,却忘了缓存失效逻辑本身才是最大瓶颈。比如数据库查完缓存,但没设 TTL,或者键名没加业务前缀,导致不同模块互相覆盖。
- 键名建议带命名空间前缀:
user:profile:123而不是123,避免冲突 - TTL 不要全设成固定值,高频更新的数据(如库存)设短些(
60秒),低频变动的(如用户资料)可设长些(3600) - 慎用标签(
TagAwareAdapter):它方便批量失效,但底层是靠额外 key 存储映射关系,Redis 内存占用翻倍,且invalidateTags()是 O(n) 操作,n 是关联项数量










