必须为每个ThinkPHP项目配置独立Redis缓存前缀以避免key覆盖,具体步骤包括:在cache.php中为redis store设置唯一prefix(如project_a:),确保格式规范并清空runtime/cache;推荐通过.env文件动态管理prefix,或关键缓存手动拼接项目标识。

多个ThinkPHP项目共用同一个Redis实例时,缓存key互相覆盖导致数据错乱、接口返回异常或限流失效,根本原因是所有项目默认都用think:前缀且未隔离命名空间。
必须给每个项目配置独立缓存前缀
ThinkPHP默认为所有缓存key自动添加think:前缀,但这不是隔离手段——它只是统一标识,无法区分项目来源。共用Redis时,A项目的think:user_1001和B项目的think:user_1001会写入同一key,造成覆盖。
第一步:打开config/cache.php文件,在'stores' => ['redis' => [...]]配置块内,显式添加'prefix' => 'project_a:'(将project_a替换成你项目的唯一英文标识,如admin_v3或api_gateway)。
第二步:确保'prefix'值以英文字符开头、只含字母数字和下划线,结尾带冒号更安全——避免projecta_user_1001和projecta1_user_1001哈希冲突。
立即学习“PHP免费学习笔记(深入)”;
【不加prefix或prefix为空字符串会导致所有项目key完全混同,且redis-cli keys "*"无法按项目筛选】
第三步:删掉runtime/cache/目录,重启服务。旧缓存文件里可能残留未带前缀的key,不清空会导致新配置不生效。
方法一:用.env控制不同项目的驱动参数
当多个项目部署在同一台服务器但代码分离时,不要共用同一份.env文件。每个项目根目录下必须有独立的.env,且至少包含:
CACHE_DRIVER=redis
REDIS_PREFIX=project_b:
然后在config/cache.php中读取该环境变量:'prefix' => env('REDIS_PREFIX', 'think:')。这样无需修改代码即可切换前缀。
注意:如果项目使用Docker部署,确保每个容器挂载的是各自项目的.env,而非共享卷里的同一份。
方法二:动态生成key时硬编码项目标识
对关键业务缓存(如用户会话、限流计数),不依赖全局prefix,而是在代码里拼接项目标识:
$key = 'project_c:rate_limit:' . $request->ip() . ':' . md5($uri) . ':' . date('Y-m-d H:i');
这比单纯靠配置更可靠——即使某项目漏配prefix,也不会污染其他项目数据。
Cache::inc()、Cache::get()等调用全部基于这个手动构造的key,绕过框架自动加前缀逻辑。
验证是否生效
进入Redis命令行,执行keys project_a:*,应只看到本项目写入的key;再执行keys project_b:*,确认无交叉结果。
若仍看到大量think:user_*类key,说明某个项目没改prefix,或改了但没清runtime/cache/,或.env里CACHE_DRIVER仍为file导致没走Redis。



















